三分钟解决VB.NET定时器事件重入
创始人
2024-06-10 00:31:20
0

喜欢VB.NET朋友一定会很喜欢研究定时器方面的问题吧。本人就很喜欢,在网上我收集了很多东西,在这个就VB.NET定时器事件重入的问题来和大家一起探讨一下。不论在客户端应用程序还是服务器组件(包括窗口服务)定时器通常扮演一个重要的角色。写一个高效的定时器驱动型可管理代码要求对程序流程有一个清晰的理解及掌握.NET线程模型的精妙之处。.NET框架类库提供了三种不同的定时器类:System.Windows.Forms.Timer, System.Timers.Timer, 和System.Threading.Timer。每个类为不同的场合进行设计和优化。本文章将研究这三个类并让你理解如何及何时应该使用哪一个类。

VB.NET定时器事件处理重入

当和异步定时器事件打交道时,如由System.Timers.Timer和System.Threading.Timer产生的定时器事件,有另外一个细微之处你需要考虑。问题就是必须处理代码重入。如果你的定时器事件处理函数代码执行时间比你的定时器引发定时器事件的时间间隔要长,你预先又没有采取必要的措施保护防止多线程访问你的对象和变量,你就会陷入调试的困境。看一下下面的代码片断:

  1. private int tickCounter = 0;  
  2. private void tmrTimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgse)  
  3. {  
  4. System.Threading.Interlocked.Increment(ref tickCounter);   
  5. Thread.Sleep(5000);   
  6. MessageBox.Show(tickCounter.ToString());  

假设你的定时器间隔属性设置为1000毫秒,你也许会奇怪当***个信息框弹出时显示的值是5。这是因为在这5秒期间***个定时器事件正在睡眠,而定时器却在不同的工作者线程上继续产生时间消失事件。因此,在***个VB.NET定时器事件处理完成之前tickCounter变量被增加了5次。注意我使用了Interlocked.Increment方法以线程安全的方式增加tickCounter变量的值。也有其它方法可以这样做,但是Interlock.Increment是为这种操作而特别设计的。

解决这种问题的简单方法就是在你的事件处理函数代码块中暂时禁止定时器,接着再允许定时器,就像下面的代码:

  1. private void tmrTimersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgse)  
  2. {  
  3. tmrTimers.Enabled = false;   
  4. System.Threading.Interlocked.Increment(ref tickCounter);   
  5. Thread.Sleep(5000);   
  6. MessageBox.Show(tickCounter.ToString());  
  7. tmrTimersTimer.Enabled = true;  

有了这段代码,消息框就会每5秒钟显示一次,就像你所期望的那样,tickCounter的值每次只增加1。另外一些可选的原始同步对象就是Monitor或mutex去确保所有将来的事件被排队直到当前的事件处理函数执行完成。

结论
当使用定时器类时有一点你要考虑的就是是否可以使用Windows调度器去定期的运行标准的可执行程序来更简单的解决问题。

【编辑推荐】

  1. 剖析VB.NET平台调用是如何执行操作
  2. 分享个人总结VB.NET多线程
  3. VB.NET初步知识,初学者必看
  4. VB.NET函数宝典手把手教会你
  5. VB.NET动态控件数组三部曲

相关内容

热门资讯

如何允许远程连接到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 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...