.NET Framework 里的三种Timer

今天在MSDN上看到一篇文章比较.NET Framework里的三种Timer,下面做一个简单的总结:

System.Windows.Forms.Timer 

对于WinfForm 程序而言,这个timer会使用UI thread来触发和处理tick事件,简单试验一下,如果将UI Thread sleep了,那么这段时间将不会有tick触发。

image

上图可以看到,中间5秒钟的tick丢失了。

System.Timers.Timer

这个timer会启用一个独立的working thread去触发tick事件,但事件的handler还是交给UI thread来处理。当UI thread sleep了,这些tick事件会被暂时存入队列,等待UI thread处理。简单试验一下会发现,当UI Thread sleep了,tick的处理会停止,但当UI thread醒来,这些tick事件会被一次全处理完。

image

但有趣的是,对于console应用程序,事件的处理是使用的独立的线程:

image

System.Threading.Timer

这个timer将使用独立的线程来触发tick和处理tick事件,所以如果想在tick触发的时候update UI,就需要做marshal了,因为处理事件的并不是UI thread。

原文地址:https://www.cnblogs.com/k330/p/2434735.html