为什么.NET中有5个版本的Timer类?


77

.Net框架中为什么有五个计时器类,即以下类:

  1. System.Timers.Timer
  2. System.Threading.Timer
  3. System.Windows.Forms.Timer
  4. System.Web.UI.Timer
  5. System.Windows.Threading.DispatcherTimer

为什么Timer类有多个版本?它们之间有什么区别?


4
实际上有4个定时器类,你忘System.Windows.Forms.TimerSystem.Web.UI.Timer(和也System.Windows.Threading.DispatcherTimer,但它有一个不同的名字......)
托马斯·莱维斯克

1
@ThomasLevesque,谢谢您指出,我更新了问题。
Mohammed A. Fadil

2
它们的行为都不同,例如System.Threading.Timer每次滴答都会生成一个新线程。
Tenerezza

1
在这里,您可以进行以下操作:比较.NET Framework类库中的计时器类web.archive.org/web/20150329101415/https://msdn.microsoft.com/…目录-System.Windows.Forms.Timer-System.Timers。 Timer-System.Threading.Timer-使用计时器的线程安全编程-处理计时器事件重入-结论
Carlos Quintanilla

5
@MitchWheat,我看了您提供的问题,它只讨论了5分之二的问题,因此不是重复的。
Mohammed A. Fadil 2012年

Answers:


17

以下是主要计时器的说明以及我认为最值得注意的几点。

Winforms.Timer

  • 不能保证在特定时间在UI线程上打勾
  • 滴答延迟直到UI线程空闲
  • 如果UI线程繁忙,将跳过刻度线

DispatcherTimer

  • 在UI线程上调用
  • 可以设置生成滴答声所需的“空闲”级别的优先级
  • 将跳过刻度线

Threading.Timer

  • 在线程池中的工作线程上滴答-没有用于指定线程的选项
  • 壁虱总是准时触发
  • 没有跳过任何内容-当您仍在处理以前的报价时,您必须防止出现新的报价
  • 未处理的异常将使应用程序崩溃

Timers.Timer

  • 包装线程计时器
  • 在从CLR线程池获取的工作线程上打勾
  • 可以通过提供SynchronizationObject强制在特定线程上打勾
  • 壁虱总是准时触发
  • 没有一个被跳过
  • 默默地吃异常

1
壁虱总是按时发射。永远是一个有力的词。AFAIK需要一个可用的线程池线程,以便按时发生滴答。
Theodor Zoulias

11

Timers.Timer在设置的时间间隔后生成事件,并带有生成重复事件的选项。MSDN

Windows.Forms.Timer 是Winforms的控件。

Web.UI.Timer以定义的时间间隔执行异步或同步Web页面回发。MSDN

Threading.Timer是回调的计时器。创建一个新的工作线程。由线程池线程服务。MSDN

因此,这些计时器具有不同的用途,并且由不同的工具提供服务。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.