为什么.NET有5个版本的计时器类?

110

为什么在 .Net 框架中有五个计时器类,分别是以下几个:

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

为什么会有多个版本的计时器类?它们之间有什么不同?


4
实际上有四个定时器类,你忘记了 System.Windows.Forms.TimerSystem.Web.UI.Timer(还有 System.Windows.Threading.DispatcherTimer,但它的名称不同...) - Thomas Levesque
1
@ThomasLevesque,感谢您指出这一点,我已经更新了问题。 - Mohammed A. Fadil
2
它们都表现不同,例如System.Threading.Timer为每次tick生成一个新线程。 - Tenerezza
2
这里是:比较.NET Framework类库中的计时器类 https://web.archive.org/web/20150329101415/https://msdn.microsoft.com/en-us/magazine/cc164015.aspx 内容 - System.Windows.Forms.Timer - System.Timers.Timer - System.Threading.Timer - 使用计时器进行线程安全编程 - 处理计时器事件重入 - 结论 - Carlos Quintanilla
6
@MitchWheat,我查看了你提供的问题,它只讨论了5个中的2个,因此不是重复内容。 - Mohammed A. Fadil
相比其他计时器,System.Windows.Threading.DispatcherTimer 怎么样? - Jaans
3个回答

50

以下是主要定时器的描述以及我认为最值得注意的点。

Winforms.Timer

  • 在UI线程上进行计时
  • 如果UI线程空闲,则延迟进行计时
  • 如果UI线程太忙而多个计时堆积,则会跳过某些计时

DispatcherTimer

  • 在UI线程上调用
  • 可以设置何种级别的“空闲”需要生成一个计时信号
  • 如果计时信号堆积,则会跳过计时信号

Threading.Timer

  • 在来自线程池的工作线程上进行计时-没有指定线程的选项
  • 计时信号总是准时触发
  • 不会跳过任何计时信号-您必须防止在处理旧计时信号时出现新计时信号
  • 未处理的异常将导致应用程序崩溃

Timers.Timer

  • 在CLR线程池中获取工作线程的计时器包装器
  • 可以通过提供同步对象强制在特定线程上进行计时信号
  • 计时信号总是准时触发
  • 不会跳过任何计时信号
  • 忽略异常

2
“Ticks are always fired on time”这句话中的“always”是一个很强烈的词。据我所知,为了让定时器准时触发,需要有一个可用的线程池线程。 - Theodor Zoulias
5
需要更新.NET 6.0中的PeriodicTimer:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.periodictimer?view=net-6.0 - Bradley Grainger

12

Timers.Timer会在设定的时间间隔之后生成一个事件,还可以选择生成重复事件。MSDN

Windows.Forms.Timer是用于winforms的控件。

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

Threading.Timer是回调函数的计时器。它创建一个新线程来工作,并由线程池线程提供服务。MSDN

因此,这些计时器具有不同的目的,也使用不同的工具进行服务。


4
这个问题现在已经被微软在MSDN文章中回答了,有关“System.Timers.Timer”的详细信息,请参阅:https://learn.microsoft.com/en-us/dotnet/api/system.timers.timer?view=net-5.0 提示:请注意,.NET包括四个名为Timer的类,每个类都提供不同的功能:
- System.Timers.Timer(这个主题):定期触发事件。该类旨在用作多线程环境下的服务器或服务组件;它没有用户界面,并且在运行时不可见。 - System.Threading.Timer:在固定时间间隔内在线程池线程上执行单个回调方法。当定时器实例化时定义回调方法,无法更改。与System.Timers.Timer类一样,此类旨在用作多线程环境下的服务器或服务组件;它没有用户界面,并且在运行时不可见。 - System.Windows.Forms.Timer(仅适用于.NET Framework):一个Windows窗体组件,可以定期触发事件。该组件没有用户界面,设计用于单线程环境。 - System.Web.UI.Timer(仅适用于.NET Framework):一个ASP.NET组件,可以按照规律间隔执行异步或同步网页回发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接