当前位置: 首页 > 编程语言 > C#

计时器在交叉线程中不起作用分享

时间:2023-04-10 15:36:23 C#

C#学习教程:定时器在跨线程中不起作用两者都在窗体的构造函数中初始化。但尚未。构造函数启动一个新线程,启用并启动两个计时器。明明都是跨线程的,但是并没有抛出任何跨线程的异常。但它甚至不起作用。它不会触发Timer.Tick方法。这是代码:第一种方法:在构造函数的形式中:KeepMeAliveTimer=newTimer();//定时器1KeepMeAliveTimer.Interval=15000;KeepMeAliveTimer.Tick+=KeepMeAlive;计时器1=新计时器();//定时器2timer1.Interval=15000;timer1.Tick+=timer1_Tick;//在新线程中启动了一个新线程://在执行一些任务后,它启用计时器KeepMeAliveTimer.Enabled=true;//定时器1KeepMeAliveTimer.Start();timer1.Enabled=true;//定时器2timer1.Start();但是并没有启动Timer的tick事件,甚至没有抛出任何异常。第二种方法:但是当我在同一个线程(主线程)中初始化和启用定时器时,它们工作得很好:KeepMeAliveTimer=newTimer();//定时器1KeepMeAliveTimer.Interval=15000;KeepMeAliveTimer.Tick+=KeepMeAlive;KeepMeAliveTimer.Enabled=true;KeepMeAliveTimer.Start();计时器1=新计时器();//定时器2timer1.Interval=15000;timer1.Tick+=timer1_Tick;timer1.Enabled=true;timer1.开始();现在的问题是;如果没有任何异常,为什么第一种方法不起作用?Timer类是线程安全的,但不是您想象的那样。在工作线程上调用Start()方法实际上启动了计时器。该类完成了创建隐藏窗口的工作,因此它可以调用SetTimerwinapi函数并在完成时接收WM_TIMER消息。但是,如果没有人正在侦听消息,则无法引发Tick事件。你没有,你肯定没有在该线程上调用Application.Run()。因此,您不应在工作线程上启动计时器。如有必要,使用Control.BeginInvoke在UI线程上启动它。或者使用不依赖于消息循环的System.Threading.Timer或System.Timers.Timer。您必须正确地互锁他们的Elapsed事件或回调在另一个线程上运行。哪种解决方案往往会产生另一个问题。以上就是C#学习教程的全部内容:定时器在跨线程下不起作用。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢