相关文章推荐
酷酷的领带  ·  Accumulator $addToSet ...·  1 年前    · 
爱笑的茶壶  ·  Python - Tuple ...·  2 年前    · 
曾经爱过的皮蛋  ·  python - OSError: ...·  2 年前    · 
玩滑板的绿茶  ·  RuoYi-Cloud 登陆 /code ...·  2 年前    · 
C#有哪几种实现定时器的方案?我这么回答不对?终面被刷很不甘心

C#有哪几种实现定时器的方案?我这么回答不对?终面被刷很不甘心

在C#里关于定时器类就有三个

1、System.Windows.Forms.Timer

2、System.Threading.Timer

3、定义在System.Timers.Timer

下面对这三个类进行讲解。

System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中 的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。

System.Timers.Timer和System.Threading.Timer非常类似,它们都是通过.NET Thread Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的System.Windows.Forms.Timer控件。

按照惯例还是分享干货:VS2022安装包-教程 / C#10&.NET6零基础教程合集

VS2022 / C#10/.NET6零基础教程合集

平心而论,C#易于上手,新手友好也是其一大亮点。如果你是编程小白,或想系统深入地快速掌握C#编程。本教程千万别错过。真的录制不易!反正我是免费分享啊,不要白不要惹! 还有.NET6完整教程(99P视频),全都是公益分享!

本教程——全网首套.NET6从零基础入门到实战全集 (含环境安装+C#基础+.NET6基础+.NET6实战)

轻松上手最新的.NET6开发,快人一步拿高薪!需要的小伙伴可免费自取!

资料免费自取:

由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴, 可点击这里,添加我知乎主页个人说明处号码 免费分享

也可直接点击下方卡片: 点击后可自动复制威芯号,并跳转到威芯。得辛苦大家自行搜索威芯号添加。内容已做打包,添加后直接发送注意查收!

继续正文~

System.Windows.Forms.Timer

计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用,适用于单线程环境,

在此环境中, UI 线程用于执行处理。它要求用户代码提供 UI 消息泵, 并且始终从同一线程操作, 或将调用封送到

其他线程。Windows 窗体计时器组件是单线程的, 且限制为55毫秒的准确度,准确性不高

 public partial class frmTimerDemo : Form
 private System.Windows.Forms.Timer timerGetTime;
 private void frmTimerDemo_Load(object sender, EventArgs e)
 //创建定时器
 timerGetTime = new System.Windows.Forms.Timer();
 //设置定时器属性
 timerGetTime.Tick+=new EventHandler(HandleTime);
 timerGetTime.Interval = 1000;
 timerGetTime.Enabled = true;
 //开启定时器
 timerGetTime.Start();
 public void HandleTime(Object myObject, EventArgs myEventArgs)
 labelTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
 private void frmTimerDemo_FormClosed(object sender, FormClosedEventArgs e)
 //停止定时器
 timerGetTime.Stop();
 }

System.Timers.Timer

这个是目前我们定时项目中常用的。

System.Timers.Timer t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);//到达时间的时候执行事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
t.Start(); //启动定时器
//上面初始化代码可以写到构造函数中
public void Execute(object source, System.Timers.ElapsedEventArgs e)
 t.Stop(); //先关闭定时器
 MessageBox.Show("OK!");
t.Start(); //执行完毕后再开启器
}

这里需要注意的是Execute方法中一定要先关闭定时器,执行完毕后再开启。这个是本人经过测试的,如果你注释掉这两句,定时器会不断的执行Execute方法,如果Execute执行的是一个很耗时的方法,会导致方法未执行完毕,定时器又启动了一个线程来执行Execute方法。

System.Threading.Timer

线程计时器也不依赖窗体,是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持,先看下面代码

class Program
 int TimesCalled = 0;
 void Display(object state)
 Console.WriteLine("{0} {1} keep running.", (string)state, ++TimesCalled);
 static void Main(string[] args)
 Program p = new Program();
 //2秒后第一次调用,每1秒调用一次
 System.Threading.Timer myTimer = new System.Threading.Timer(p.Display, "Processing timer event", 2000, 1000);