.NET Framework计时器对象应用技巧分享
创始人
2024-06-19 09:51:02
0

.NET Framework作为一种比较全面的开发环境,可以为用户创造出多种适合不同需求的环境进行方便的开发。不管在哪种平台领域,计时器对象在日常开发中有着相当重要的地位。在.NET中,如果平常你不是特别注意的话,那你肯定不会发现,在.NET Framework计时器对象中竟然存在三个Timer类型,分别在:#t#

System.Timers

System.Threading

System.Windows.Forms

三个不同的命名空间下。(这里我们还暂且不算ASP.NET AJAX中新的那个Timer,这个Timer是用于客户端的计时器对象。)那么我相信很多人会不解,都是定时器的功能,为什么还要定义这么多不同的Timer类型呢?抛开其在使用上的细微不同,我们这里就根据MSDN对这三种不同Timer的描述来作一个比较:

  1. System.Timers.Timer :System.
    ComponentModel.Component,
    ISupportInitialize 

首先这个.NET Framework计时器对象Timer类型是一个标准的定时器对象,我们暂且认为它的名称空间缘故吧,它存在于System程序集里面。在MSDN里面对它的定义是一个Server-Based Timer(基于服务器的计时器),它是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,因此它是最为精确的一种计时器。我们可以简单的把它理解为Windows服务的执行机制,只要宿主线程没有被释放,System.Timers.Timer只要处于活动状态,就会一直存在下去,直到你手工停止或宿主线程结束。

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

  1. System.Threading.Timer :
     MarshalByRefObject, IDisposable 

这是一种轻量型的计时数,它在使用上与System.Timers.Timer的不同表现在:

使用回调机制,而不是事件机制。

.NET Framework计时器对象中的构造器中可以指定首次执行时间(构建后或修改后开始算)和间隔执行时间,这两个时间(dueTime,period)可以是不同的。
它是没有开始和结束控制接口,从构建开始算,直至释放结束。

它基于ThreadPool线程机制,遵循着上述System.Timers.Timer的相同原则(红色部分)。同时它在生命周期方面也有必须要注意的地方,它没有开始或停止(有释放接口Dispose)方法。在它的生命周期中,必须被其它对象所引用。一旦它不被任何对象所引用,那么就意味着这个Timer对象变成一个不可达对象,会被GC回收。MSDN原文解释:

“只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。”

MSDN中还有这样一段话:

“System.Threading..::.Timer is a simple, lightweight timer that uses callback methods and is served by thread pool threads. It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread. System.Windows.Forms..::.Timer is a better choice for use with Windows Forms. For server-based timer functionality, you might consider using System.Timers..::.Timer, which raises events and has additional features.”

它告诉我们:System.Threading.Timer是一个简单的,轻量级的,利用回调机制和线程池机制的计时器。在Windows Forms的场景下不建议我们使用这个对象,因为UI线程并不触发回调函数,取而代之是Windows.Forms.Timer ,而如果希望利用基于服务器计时器的功能,则建议我们使用System.Timers.Timer。

System.Windows.Forms.Timer : System.ComponentModel.Component
这一种专门服务于Windows Forms的计时器,它在机制和原理上都与前面两种有着比较大的区别。在接口使用上与System.Timers.Timer比较相似,同时具备了一些的Windows Form控件的特征。同时它的精度设计上也不是很高。

“Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。

使用此计时器时,请使用 Tick 事件执行轮询操作,或在指定的时间内显示启动画面。每当 Enabled 属性设置为 true 且 Interval 属性大于 0 时,将引发 Tick 事件,引发的时间间隔基于 Interval 属性设置。”

在三种.NET Framework计时器对象中,都会一些共性和不同侧重点,希望通过这样一比较,让大家都能对.NET Framework中的Timer对象有更深的了解,进而正确合理的使用它们。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...