今天在MSDN上看到一篇文章比较.NET Framework里的三种Timer,下面做一个简单的总结:
对于WinfForm 程序而言,这个timer会使用UI thread来触发和处理tick事件,简单试验一下,如果将UI Thread sleep了,那么这段时间将不会有tick触发。
上图可以看到,中间5秒钟的tick丢失了。
这个timer会启用一个独立的working thread去触发tick事件,但事件的handler还是交给UI thread来处理。当UI thread sleep了,这些tick事件会被暂时存入队列,等待UI thread处理。简单试验一下会发现,当UI Thread sleep了,tick的处理会停止,但当UI thread醒来,这些tick事件会被一次全处理完。
但有趣的是,对于console应用程序,事件的处理是使用的独立的线程:
这个timer将使用独立的线程来触发tick和处理tick事件,所以如果想在tick触发的时候update UI,就需要做marshal了,因为处理事件的并不是UI thread。