C# 为什么.NET中有5个版本的计时器类?
为什么.Net framework中有五个计时器类,即:C# 为什么.NET中有5个版本的计时器类?,c#,.net,timer,C#,.net,Timer,为什么.Net framework中有五个计时器类,即: System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer System.Web.UI.Timer System.Windows.Threading.dispatchermer 为什么计时器类有几个版本?它们之间的区别是什么?定时器。定时器在设定的时间间隔后生成事件,并具有生成重复事件的选项 Windows.Forms.Timer是winforms的控件 We
System.Timers.Timer
System.Threading.Timer
System.Windows.Forms.Timer
System.Web.UI.Timer
System.Windows.Threading.dispatchermer
为什么计时器类有几个版本?它们之间的区别是什么?
定时器。定时器在设定的时间间隔后生成事件,并具有生成重复事件的选项
Windows.Forms.Timer
是winforms的控件
Web.UI.Timer
以定义的间隔执行异步或同步网页回发
Threading.Timer
是回调的计时器。创建用于工作的新线程。由线程池线程提供服务
所以,这些计时器有不同的用途,也有不同的工具 以下是对主要计时器的描述,以及我认为最值得注意的要点
Winforms.Timer
- UI线程上的勾号不保证在特定时间进行记录
- 勾号延迟到UI线程空闲
- 如果UI线程忙,将跳过勾号
dispatchermer
- 在UI线程上调用
- 可以为生成勾号所需的“空闲”级别设置优先级
- 将跳过滴答声
Threading.Timer
- 线程池中工作线程上的记号-没有指定线程的选项
- 滴答声总是准时发射
- 不会跳过任何标记-在处理以前的标记时,必须防止出现新的标记
- 未处理的异常将使应用程序崩溃
Timers.Timer
- 环绕线程计时器
- 从CLR线程池获取的工作线程上的记号
- 可以通过提供SynchronizationObject强制在特定线程上打勾
- 滴答声总是准时发射
- 没有跳过
- 默默地吃例外
这个问题现在由微软在MSDN文章中为
system.timers.timer
小费
请注意.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组件,它在同一时间执行异步或同步网页回发
定期休息
实际上有4个计时器类,你忘记了System.Windows.Forms.Timer
和System.Web.UI.Timer
(还有System.Windows.Threading.dispatchermer
,但它有一个不同的名称…)@ThomasLevesque,谢谢你指出,我更新了这个问题。它们的行为都不同,示例System.Threading.Timer每次滴答声都会生成一个新线程。现在开始:比较.NET Framework类库内容中的计时器类-System.Windows.Forms.Timer-System.Timers.Timer-System.Threading.Timer-使用计时器进行线程安全编程-处理计时器事件重新进入-Conclusion@MitchWheat,我看了一下你提供的问题,它只讨论了5个问题中的2个,因此它不是重复的。滴答声总是准时发射的。“永远”是一个强有力的词。AFAIK需要一个可用的线程池线程,才能按时打勾。