为你解决VB.NET定时器编程线程安全问题

开发 后端
文章主要就VB.NET定时器编程问题来描述,为了最大限度的代码重用,三种不同类型的定时器事件都调用了同样的ShowTimerEventFired方法,下面就是三个定时器事件的处理函数。

经过长时间学习VB.NET,对于它还是很了解的,在这里和大家分享一下关于VB.NET定时器编程,看完本文你肯定有不少收获,希望本文能教会你更多东西。

VB.NET定时器编程

为了***限度的代码重用,三种不同类型的定时器事件都调用了同样的ShowTimerEventFired方法,下面就是三个定时器事件的处理函数:

  1. private void tmrWindowsFormsTimer_Tick(object sender, System.EventArgse)  
  2. {   
  3. ShowTimerEventFired(DateTime.Now, GetThreadName());  
  4. }  
  5. private void tmrTimersTimer_Elapsed(object sender, System.TimersElapsedEventArgse){  
  6. ShowTimerEventFired(DateTime.Now, GetThreadName());  
  7. }  
  8. private void tmrThreadingTimer_TimerCallback(object state){ ShowTimerEventFired(DateTime.Now, GetThreadName());  

正如你所看到的,ShowTimerEventFired方法采用当前时间和当前线程名字作为参数。为了区别工作者线程和UI线程,在例子程序的主入口点设置CurrentThread对象的名字属性为"UIThread"。GetThreadName帮助函数返回Thread.CurrentThread.Name值或者当Thread.CurrentThread.IsThreadPoolThread属性为真时返回"WorkerThread"。

因为System.Timers.Timer和System.Threading.Timer的定时器事件都是在工作者线程上执行的,所以在事件处理函数中的任何用户交互代码都不是马上进行的,而是被列集等候返回到UI线程上进行处理。为了这样做,我创建了一个ShowTimerEventFiredDelegate委托调用:

  1. private delegate void ShowTimerEventFiredDelegate (DateTime eventTime, string threadName); 

ShowTimerEventFiredDelegate允许ShowTimerEventFired方法在UI线程上调用它自己,显示了发生这一切的代码。

通过查询InvokeRequired属性可以非常容易的知道你是否从当前线程可以安全的访问Windows窗体控件。在这个例子中,如果列表框的InvokeRequired属性为真,窗体的BeginInvoke方法就可以被ShowTimerEventFired方法调用,然后再被ShowTimerEventFiredDelegate方法调用。这能够保证列表框的Add方法在UI线程上执行。

正如你所看到的,当你编写异步定时器事件时有许多问题需要意识到。在使用System.Timers.Timer和System.Threading.Timer之前我推荐你阅读Ian Griffith的文章“Windows Forms:Give Your .NET-based Application a Fast and Responsive UI with Multiple Threads”, 该文刊登在MSDN杂志的2003年2月份的期刊上。上述是一个关于VB.NET定时器编程线程安全上的问题的分析,提到的问题大家在编程中要注意。

【编辑推荐】

  1. 实例讲述VB.NET使用Log4Net
  2. 三分钟学会VB.NET转换形态
  3. VB.NET获取硬盘信息四大法宝
  4. 讲述VB.NET调用Excel的好处
  5. 简单例子概述VB.NET新窗体
责任编辑:田树 来源: 赛迪网
相关推荐

2009-10-28 10:31:59

VB.NET Syst

2009-10-28 10:58:34

VB.NET定时器事件

2009-10-28 10:23:48

VB.NET定时器

2009-10-12 13:32:58

VB.NET线程构造器

2009-10-28 11:13:39

VB.NET虚拟框架

2009-10-20 10:59:32

VB.NET编程

2009-11-03 10:30:47

VB.NET继承

2009-10-12 14:32:40

VB.NET实现定时关

2009-10-20 10:23:08

VB.NET多线程编程

2009-10-23 17:03:18

VB.NET事件编程

2009-11-10 13:03:45

VB.NET虚拟码

2009-11-02 15:16:07

VB.NET编程

2009-10-12 13:19:14

VB.NET线程同步

2009-10-12 13:11:48

VB.NET使用线程

2010-01-11 18:05:24

VB.NET窗体继承

2009-10-14 15:34:29

VB.NET窗体编程模

2009-11-02 15:08:58

VB.NET Obje

2009-11-10 13:08:13

VB.NET编程技巧

2010-01-14 17:11:17

VB.NET枚举

2009-11-02 10:42:04

VB.NET EXCE
点赞
收藏

51CTO技术栈公众号