#定时器 tick_【干货】C#.NET 定时器类及使用方法

本文介绍了.NET中三种常用的定时器类:System.Windows.Forms.Timer、System.Threading.Timer和System.Timers.Timer,详细讲解了它们的工作原理、优缺点以及使用步骤,并给出了示例代码。System.Windows.Forms.Timer适合Windows Forms应用,不涉及多线程;System.Threading.Timer在独立线程上执行,更准确但可能引发回调方法重入;System.Timers.Timer较旧且精度受消息队列影响。
摘要由CSDN通过智能技术生成

  cfd4d710a59b535d062a017d38f4bd4f.png

       在.net常用的定时器类有下面三种,使用定时器时需要设定参数,如间断时间、定时器计溢出后的回调函数、延时、开始等,定时器的的主要方法有开始、终止等,不同的定时器实现上述的方法会有一些差异,本文会针对具体的定时器一一举例说明。

  • 1、System.Windows.Forms.Timer类

  • 2、System.Threading.Timer类

  • 3、System.Timers.Timer类

System.Windows.Forms.Timer

  从这个定时器的命名空间可以看出,.net设计这个定时器的目的是为了方便程序员在Window Form中使用的定时器。当一个System.Windows.Forms.Timer类被构造时,当前定时器会和当前线程进行关联。而当计时器的计满后,一个定时器消息将被插入到当前线程的消息队列中。当前线程逐一处理消息中的所有消息,并一一派发给各自的处理方法。这样的机制和利用工作者进程定时有很大的区别,System.Windows.Forms.Timer类型并没有涉及多线程的操作,定时器的设置、定时方法的执行都在同一个线程之上。这就意味着System.Windows.Forms.Timer并不能准确计时,尤其当消息阻塞时,定时器的误差将会更大,因为定时器消息只能等待在前面的所有消息处理完后才能得到处理。但是因为System.Windows.Forms.Timer类型的定时器并不涉及多线程的操作,因此是线程安全的,不会发生回调方法重入的问题。

   主要使用步骤如下:

1.  System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();//实例化  2.  myTimer.Tick += new EventHandler(函数名); //给timer挂起事件 3.  myTimer.Enabled = true;//使timer可用 4.  myTimer.Interval = n; //设置时间间隔,以毫秒为单位 5.  myTimer.Stop(); //如果要暂停计时则使用Stop()方法 6.  myTimer.Enabled = false;//若要停止使用timer,则使之不可用

System.Windows.Forms.Timer例程:

192d81cbe4c3be6ed71b2ec246322c27.png

System.Threading.Timer

  这个定时器类的使用相对复杂,但同时它也是最优化的一个定时器类型。System.Threading.Timer的定时方法在独立的线程上执行,定时时间更为准确。所有的对象有一个线程控制,当下一个定时到达时,该线程会负责在线程中获得一个新的工作者线程,用以执行相应的回调方法。虽然这个定时器是相对最优化的一个定时器类型,但是从其机制上来讲,其并不是线程安全的,可能会出现回调方法重入的问题。解释下方法重入,是一个有关多线程编程的概念,意思大概是:同一程序中,多个线程同时运行时,就可能发生同一个方法被多个进程同时调用的情况。当这个方法中存在一些非线程安全的代码时,方法重入会导致数据发生同步错误的bug。

      主要使用步骤如下:

1、实例构造一个线程定时器。

     System.Threading.Timer  mytimer = new System.Threading.Timer(new  System.Threading.TimerCallback(timerCall), null, 0, 1000);

★timer构造函数资料:

e97463e579826a5c1be21e8f3d031743.png

        https://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.110).aspx

2、编写timerCall回调函数

     格式:private  void  timerCall(object   xxxxx)  { .......; .......;}

3、使用Change(Int32,Int32)方法来修改定时器参数实现停止、重新开始等。

4、使用Dispose()方法释放定时器资源。

System.Threading.Timer例程:

b083363506744485899cd05a447a27b2.png

System.Timers.Timer类

  这是一个相对较旧的类型,它和System.Threading.Timer一样,可以由工作者线程来执行回调方法,但同时它也可以在IDE环境中被拖到窗体控件上,这个时候它的行为非常类似于System.Windows.Forms.Timer类型,在消息过多时其定时并不准确。  System.Timers.Timer可以视为System.Threading.Timer的一个包装,其类型设计相对古老,不建议使用该定时器。

System.Timers.Timer例程代码

f32f9965e020266437eb7fd77bd5f79d.png

System.Windows.Threading.DispatcherTimer类型(补充)

  System.Windows.Threading.DispatcherTimer集成到按指定时间间隔和指定优先级处理的 Dispatcher 队列中的计时器。因为 DispatcherTimer 操作与其他操作一样被放置到Dispatcher队列中,何时执行DispatcherTimer 操作取决于队列中的其他作业及其优先级,因此它不能保证会正好在时间间隔发生时执行计时器,但能够保证不会在时间间隔发生之前执行计时器。如果 System.Timers.Timer 用于 WPF 应用程序,则值得注意的是 System.Timers.Timer 运行于不同于user interface(UI) 线程的其他线程上。为了访问user interface (UI) 线程上的对象,需要使用 Invoke 或 BeginInvoke 将操作发布到user interface (UI) 线程的 Dispatcher 上。

ff01d0e76abdd50b92b80f9ebe9264bf.png

END

5eb73adc97659e197a52483cde7b475b.gif

●C#会不会成为移动开发最便捷语言?

●C# 委托、泛型委托与Lambda表达式

● .Net平台下的B/S开发框架

●C#多线程读写同一文件处理

●C#使用 MQTTnet 快速实现 MQTT 通信

●socket网口通信通用实例

bc3bca9021f08216541df3bf3311b4b1.png

f70c80a0e2cb8d02ec166cce1eb122fe.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值