.NET中的四个Timer
四个Timer包括:
System.Threading.Timer
System.Windows.Forms.Timer
System.Timers.Timer
System.Windows.Threading.DispatcherTimer
1、System.Threading.Timer —— 提供以指定的时间间隔执行方法的机制。无法继承此类。
System.Threading.Timer是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。使用 TimerCallback 委托指定希望 System.Threading.Timer 执行的方法。计时器委托在构造计时器时指定,并且不能更改。由计时器执行的回调方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。
没有提供Start和Stop等方法来控制定时器,关闭定时器时,通过销毁对象来实现,即通过Dispose 方法释放计时器持有的资源。如果希望在计时器被释放时接收到信号,请使用接受 WaitHandle 的 Dispose(WaitHandle) 方法重载。计时器已被释放后,WaitHandle 便终止。
不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。
注意:
只要在使用 System.Threading.Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 System.Threading.Timer 的引用,计时器会被垃圾回收。即使 System.Threading.Timer 仍处在活动状态,也会被回收。
2、System.Windows.Forms.Timer —— 实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。
System.Windows.Forms.Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。
使用此计时器时,请使用 Tick 事件执行轮询操作,或在指定的时间内显示启动画面。每当 Enabled 属性设置为 true 且 Interval 属性大于 0 时,将引发 Tick 事件,引发的时间间隔基于 Interval 属性设置。 此类提供用于设置时间间隔以及启动和停止计时器的方法。
注意:
Windows 窗体 Timer 组件是单线程组件,精度限定为 55 毫秒。
3、System.Timers.Timer —— 在应用程序中生成定期事件。
System.Timers.Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。
基于服务器的 System.Timers.Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。
Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。
如果和用户界面元素(如窗体或控件)一起使用 System.Timers.Timer,请将包含有 System.Timers.Timer 的窗体或控件赋值给 SynchronizingObject 属性,以便将此事件封送到用户界面线程中。
如果 System.Timers.Timer 用于 WPF 应用程序,则值得注意的是 System.Timers.Timer 运行于不同于用户界面 (UI) 线程的其他线程上。 为了访问用户界面 (UI) 线程上的对象,需要使用 Invoke 或 BeginInvoke 将操作发布到用户界面 (UI) 线程的 Dispatcher 上。
注意:
在一个线程调用 Stop 方法或将 Enabled 属性设置为 false 的同时,可在另一个线程上运行事件处理方法。这可能导致在计时器停止之后引发 Elapsed 事件。
4、System.Windows.Threading.DispatcherTimer —— 集成到按指定时间间隔和指定优先级处理的 Dispatcher 队列中的计时器。
DispatcherTimer 与 Dispatcher 运行于相同的线程,并且可以在 DispatcherTimer 上设置 DispatcherPriority。
注意:
不能保证会正好在时间间隔发生时执行计时器,但能够保证不会在时间间隔发生之前执行计时器。