码迷,mamicode.com
首页 > Windows程序 > 详细

C# 定时器

时间:2019-12-12 13:03:08      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:界面   system   应用程序   保留   针对   bsp   lap   ica   rms   

 

三个定时器分别是

  1. 实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。
    System.Windows.Forms.Timer
  2. 提供以指定的时间间隔执行方法的机制。无法继承此类。
    System.Threading.Timer
  3. 在应用程序中生成定期事件。
    System.Timers.Timer

Forms.Timer

这个timer跟js中的定时器道理相同,它并不开辟一个线程,它只是把事件加入到队列中,它用的是UI线程。所以它的好处就是轻便简单。因为没有实体不消耗资源,所以这个timer无法回收。窗体timer和线程timer、计时器timer不同,因为后两者dispose之后,GC可以收集,而前者无法收集。
使用这个Forms.Timer不能执行IO,网络请求等耗时操作,否则阻碍UI线程,界面卡住不动。

Timers.Timer和Threading.Timer都会开辟线程。

Timers.Timer

System.Timers.Timer只要处于活动状态,就会一直存在下去,直到你手工停止或宿主线程结束。MSDN上还有这样一段话“Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。”也就是说,在你在每次的Elapsed 事件处理在下一次轮循时间到来的时候还没有结束,Timer对象仍然会另一个线程中启动Elapsed 的处理事件。这种机制的后果就可能会导致你的Timer已经被结束了,但是还会再执行Elapsed事件,MSDN的原文:“在一个线程调用 Stop 方法或将Enabled 属性设置为 false 的同时,可在另一个线程上运行事件处理方法。这可能导致在计时器停止之后引发 Elapsed 事件。”针对这种情况,如果你不愿让它发生,你可能就必须做一些额外的工作来避免它的发生。这种机制同样也适用于System.Threading.Timer。

Threading.Timer

System.Threading.Timer : MarshalByRefObject, IDisposable 这是一种轻量经的计时数,它在使用上与System.Timers.Timer的不同表现在:使用回调机制,而不是事件机制。构造器中可以指定首次执行时间(构建后或修改后开始算)和间隔执行时间,这两个时间(dueTime,period)可以是不同的。它是没有开始和结束控制接口,从构建开始算,直至释放结束。它基于ThreadPool线程机制,遵循着上述System.Timers.Timer的相同原则(红色部分)。同时它在生命周期方面也有必须要注意的地方,它没有开始或停止(有释放接口Dispose)方法。在它的生命周期中,必须被其它对象所引用。一旦它不被任何对象所引用,那么就意味着这个Timer对象变成一个不可达对象,会被GC回收。MSDN原文解释:
“只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。”

C# 定时器

标签:界面   system   应用程序   保留   针对   bsp   lap   ica   rms   

原文地址:https://www.cnblogs.com/ashbur/p/12028344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!