雁过请留痕...
代码改变世界

定时器Timer的选择

2012-08-18 18:20  xiashengwang  阅读(511)  评论(0编辑  收藏  举报

FCL提供了好几个Timer供我们选择,但却让很多人分不清他们的使用场合。下面来总结一下:

  1. System.Threading的Timer类。要在线程池上定时执行后台任务,他就是就好的选择。
  2. System.Windows.Forms的Timer类。这个类可以通过Vs的设计界面拖拽,它和UI线程是相关的,它使用的就是UI线程,所以在这里面执行UI更新的操作不会报线程非法访问的错。但是,如果在定时执行的函数里有长时间的运行任务,则会阻塞UI线程,造成界面”假死“。
  3. System.Windows.Threading的DispatcherTimer类。这个是System.Windows.Forms的Timer类在WPF和Silverlight类中的等价物。
  4. System.Timers的Timer类。这是微软早期的产物,可以在界面上拉动,是对System.Threading的Timer类的封装。显得有点不伦不类,建议不要使用这个类。

关于System.Threading的Timer类

public Timer(TimerCallback callback, object state, int dueTime, int period)

dueTime:代表第一次触发要等待的时间。

period:代表以后每次触发要等待的时间。

如果回调方法执行时间很长,计时器可能在上个回调方法还没有完成再次触发。为了解决这个问题,可以将period设为Timeout.Infinite,这样,回调函数就只会执行一次。然后在回调函数的最后,调用Timer的Change方法,为DueTime指定一个新的值,并在此指定period为Timeout.Infinite。