C# 各种Timer类的区别与使用

多线程计时器

多线程计时器比较强大,精确,而且可扩展性强;

只要在使用 Timer,就必须保留对它的引用。 对于任何托管对象(就是交给.NET自动释放资源的对象),如果没有对 Timer 的引用,计时器会被垃圾回收器回收。 即使 Timer 仍处在活动状态,也会被回收。

当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。 请注意,回调可能发生在 Dispose() 方法的重载被调用之后,因为计时器是按线程池线程来安排回调执行的。 可使用 Dispose(WaitHandle) 方法重载进行等待,直到完成所有的回调。

由计时器执行的回调方法是可重入的,因为它是在 ThreadPool 线程上调用的。 在以下两种情况中,此回调可以同时在两个线程池线程上执行: 一、是计时器间隔小于执行此回调所需的时间; 二、是所有线程池线程都在使用,此回调被多次排队。

System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。 不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。 System.Windows.Forms.Timer 是用于 Windows 窗体的更佳选择。 要获取基于服务器的计时器功能,可以考虑使用 System.Timers.Timer,它可以引发事件并具有其他功能。

单线程计时器:

1:System.Windows.Forms.Timer(Windows Forms Timer)

2:System.Windows.Threading.DispatcherTimer(WPF Timer)

像 System.Timers.Timer 一样,他们也提供了相同的成员(Interval,Tick,Start,Stop),但是他们内部的工作原理不同, WPF 和 Windows Forms 的计时器使用消息循环机制来取代线程池产生消息的机制。

这意味着 Tick 事件总是在创建 Timer 的那个线程上执行,同时也意味着如果上一个 Tick 消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个 Tick 消息。

下面是它们的优点:

单线程计时器比较安全,对于更新 Windows Forms Controls 或者 WPF 这种简单任务来说更方便。

你可以忘记线程安全。一个 Tick 事件在前一个 Tick 事件被处理完毕前不会被触发。你可以直接在 Tick 事件处理代码中更新控件,不需要调用 Control.Invoke 或 Dispatcher.Invoke。

在.NET Framework里面提供了三种Timer

① System.Windows.Forms.Timer

② System.Timers.Timer

③ System.Threading.Timer

现分述如下

一、System.Windows.Forms.Timer

1、基于 Windows 消息循环,用【事件方式】触发,在界面线程执行;是使用得比较多的 Timer,Timer Start之后定时(按设定的Interval)调用挂接在【Tick事件】上的 EventHandler。在这种 Timer 的 EventHandler 中可以直接获取和修改UI元素而不会出现问题,因为这种 Timer 实际上就是在【UI线程】自身上进行调用的。

2、它是一个基于 Form 的计时器。

3、创建之后,你可以使用 Interval 设置 Tick 之间的跨度,用委托(delegate)hook Tick事件。

4、调用 Start 和 Stop 方法,开始和停止。

5、完全基于UI线程,因此部分UI相关的操作会在这个计时器内进行。

6、长时间的UI操作可能导致部分 Tick 丢失。

7、Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为【单线程】环境设计的,其中UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。

8、Windows 将这个定时器与调用线程关联(UI线程)。当定时器触发时,Windows 把一个定时器消息插入到线程消息队列中。调用线程执行一个消息泵提取消息,然后发送到回调方法中(这里的myTimer_Tick方法)。而这些都是单线程进行了,所以在执行回调方法时UI会假死。所以使用这个控件不宜执行【计算受限】或【IO受限】的代码,因为这样容易导致界面假死,而应该使用多线程调用的 Timer。另外要注意的是这个控件时间精度不高,精度限定为55 毫秒。

二、System.Timers.Timer

1、用的不是 Tick 事件,而是【Elapsed事件】。

2、和 System.Windows.Forms.Timer 一样,用 Start 和 Stop 方法。

3、AutoReset 属性决定计时器是不是要发起一次事件然后停止,还是进入开始/等待的循环;System.Windows.Forms.Timer 没有这个属性。

4、设置对于UI控件的同步对象(synchronizing object),对控件的UI线程发起事件。

三、System.Threading.Timer

1、用 Threading.Timer 时的方法,和前面就不太相同了,所有的参数全部在构造函数中进行了设置,而且可以设置启动时间。而且没有提供 Start 和 Stop方法来控制计时器。而且是以一种【回调方法】的方式实现,而不是通过事件来实现的。他们之间还是有区别的。

2、我们只有销毁掉对象来停止他。当你运行时,你会发现他和前面的 Timers.Timer 一样,是多线程的,主要表现在不会假死,调试运行报错。但让你奇怪的是,我们的代码竟然无法让她停止下来。调用了 Dispose 方法也没有用。问题在那?然后进行了测试,修改了间隔时间为100ms,200ms,500ms,1000ms,3000ms,4000ms。这几种情况。发现当间隔为 500ms 以上是基本马上就停止了。而间隔时间相对执行时间越短,继续执行的时间越长。这应该是在间隔时间小于执行时间时多个线程运行造成的。因为所有的线程不是同时停止的。间隔越短,线程越多,所以执行次数越多。

3、System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由【线程池】线程提供服务。不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容