在VB.NET或C#中,可以在Windows窗体应用程序中添加一个计时器控制器,以按计划的方式运行任务。但是计时器的内部实现是什么?它是否为每个计时器使用单独的线程?还是线程池?或其他并发编程范例?
修改
另外,我想知道定时器控制器是否满足并发安全属性,如下所述?
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
i = i + 1 //Line 1
//Line 2, some code is here will takes some cpu time
i = i - 1 //Line 3
//Line 4, some code is here; takes another cpu time
End Sub
我们能否保证公共变量i
的值始终为1或0?
答案 0 :(得分:3)
Windows窗体计时器(System.Windows.Forms.Timer
)将在UI线程上运行(它会将计时器事件发布到主事件循环)。
System.Timers.Timer
默认情况下会将线程池用于计时器事件。
要回答您更新的问题:假设您正在使用System.Windows.Forms.Timer
,则在下一个tick事件运行之前,tick处理程序将始终运行完成(因为它们始终在同一个线程上运行)。不要忘记在try / finally中包装。
答案 1 :(得分:1)
来自MSDN:“计时器用于以用户定义的时间间隔引发事件。此Windows计时器专为使用UI线程执行处理的单线程环境而设计。它需要用户代码具有可用的UI消息泵,并始终在同一个线程中运行,或将调用封送到另一个线程。 (强调我的)
因此它在与您的应用程序相同的线程中运行,并且它以某种方式获取Windows消息泵以定期提升其Tick
事件。如果Tick
事件中的代码需要一段时间才能运行,那么您的应用在完成之前不会更新其UI。您可以使用DoEvents
在长时间运行Tick
事件期间让UI更新,从而避免各种麻烦,但我建议使用BackgroundWorker
代替它 - 它有点儿编码更难,但更容易正确。