几种定时器(timer)的区别
在.NET的框架之内定时器有以下几种,各自的特点是:
System.Windows.Forms.Timer
- System.Windows.Forms.Timer (仅 .NET Framework),这是一个触发事件并定期在一个或多个事件接收器中执行代码的 Windows 窗体组件。 组件没有用户界面,旨在在单线程环境中使用;它在 UI 线程上执行。专门用于单线程环境。
如果Tick事件内的代码未执行完成,但是下一次Tick定时已经达到会发生什么?不会强行终止未完成的代码,也不会因为上一次Tick事件代码未执行完成而不再触发,而是类似于栈的形式将之前未执行完成的代码堆积,后触发的Tick事件内的代码先执行,先触发未完成的代码后执行。
System.Web.UI.Timer
- System.Web.UI.Timer (仅 .NET Framework),是一种定期执行异步或同步网页回发的 ASP.NET 组件。
System.Threading.Timer
- System.Threading.Timer,它按固定的时间间隔对线程池线程执行单个回调方法。 回调方法是在实例化计时器时定义的,无法更改。 与 System.Timers.Timer 类一样,此类用作多线程环境中基于服务器的或服务组件;它没有用户界面,在运行时不可见。
各种用法较为原始,用的较少。
System.Timers.Timer
- System.Timers.Timer,它将触发事件,并定期在一个或多个事件接收器中执行代码。 类旨在用作多线程环境中基于服务器的组件或服务组件;它没有用户界面,在运行时不可见。
是对System.Threading.Timer的一层封装。可以用SynchronizingObject=this实现在主线程运行;默认 null,事件在线程池里触发,作为后台线程使用,基本能满足开发需求。
AutoReset=false,仅在指定时间间隔后引发一次 Elapse 事件;默认true,将按 Interval 定义的时间间隔定期引发事件。
Enable=true,引发 Elapse 事件,默认false。
此类型实现了 IDisposable 接口。需要直接或间接释放资源 Close。调用Close后,不会中断运行中的callback,只是下次不再回调。
callback 的执行时间如果很长(超过Interval),计时器可能再次触发,引起“重入”。
可以使用Interlocked,下一个Elapse发生的时候如果当前callback没有执行完毕就放弃,解决重入经常出现的问题。
DispatcherTimer
- DispatcherTimer,Dispatcher队列中的计时器,不能保证正好在设置的时间间隔发生时执行计时器,但能保证不会在时间间隔发生之前执行计时器。何时执行DispatcherTimer操作取决于队列中其他作业及其优先级。
随着时间的推移用不好的话,太吃内存了