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

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

创新互联建站是一家专业提供祥符企业网站建设,专注与成都网站设计、网站建设、H5页面制作、小程序制作等业务。10年已为祥符众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

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定时器编程线程安全上的问题的分析,提到的问题大家在编程中要注意。

文章名称:为你解决VB.NET定时器编程线程安全问题
文章网址:http://www.shufengxianlan.com/qtweb/news32/45132.html

成都网站建设公司_创新互联,为您提供网站设计公司微信小程序静态网站网站设计品牌网站设计营销型网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联