System.Windows.Forms.Timer

Beat和process都是通过UI thread,如果UI threadbe被suspend,那么timer既不会beat,也不会处理tick事件。

System.Timers.Timer

可以多线程访问,线程安全。

Beat和process都有独立的线程来完成(通过CLR来分配),因此要注意从该类型timer访问UI的问题。

关于SynchronizingObject属性:timer会使用SynchronizingObject.BeiginInvoke方法来运行事件委托,例如将SynchronizingObject设置成某Form,则当该UI线程不能响应时,Timer仍会beat(触发事件),但不能处理事件(直到UI线程响应),这也是和Windows Timer的一个区别。

由于Timer可能会被从多线程访问,因此也会出现Stop方法被调用以后,Elapsed事件仍然在运行的情况。Elapsed事件中的SignalTime属性就可以获得Timer运行的时间。

重置Interval属性会将Timer的时间计数重置成0。

System.Threading.Timer

首先,构造函数就有很大不同:

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

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

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

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

a. callback即是回调方法,签名是public void TimerCallback(object state)

b. 每次会将此对象传给回调方法,可以为null。因为回调方法会在独立的线程上被触发,因此要注意保证访问state对象的同步问题。

c. dueTime指定多久后fire第一次timer event

d. period指定callback被fire的间隔

e. Change方法可以修改dueTime和period值

f. 由于是在独立的work thread上触发,timer的事件永远不会被阻塞

posted on 2009-03-30 11:42  Yao Min  阅读(461)  评论(0编辑  收藏  举报