.NET计时器控制器的内部

时间:2017-03-16 06:23:33

标签: c# .net vb.net winforms

在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?

2 个答案:

答案 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代替它 - 它有点儿编码更难,但更容易正确。