C# Timer类详解

来源:互联网 发布:淘宝联盟站长 编辑:程序博客网 时间:2024/05/19 20:46

在winform编程中,我们经常会使用Timer类,但如何使用合适的Timer类就需要我们对Timer类有个详细的了解。

Timer类有三种:

1.定义在System.Windows.Forms里   (单线程)
2.定义在System.Threading.Timer类里   (多线程)
3.定义在System.Timers.Timer类里 (多线程)

System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制来取代线程池产生消息的机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息,所以除非Tick事件的处理代码执行的非常快,否则UI界面会变得响应很慢。Windows Forms的计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。否则,你需要一个多线程计时器。单线程Timer主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。


System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。

System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生。

System.Timers.Timer.简单的对System.Threading.Timer进行了包装。增加了下面几个特性。

实现了Component,所以可以在设计器显示。代替Change方法的一个Interval属性代替callback委托的一个Elapsed事件启动和停止timer的Enabled属性,默认是false。为了避免Enabled造成混乱,提供了Start和Stop方法。是否在每次指定的间隔结束时引发Elapsed时间,还是仅间隔第一次结束后运行的AutoReset属性。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

多线程Timer的执行意味着如果上一个Tick消息还未被处理,则线程池会在每次指定的间隔结束时在一个新的线程上执行下一个Tick消息,在消息循环中也会存在多个Tick消息。



1 0
原创粉丝点击