Timer事件处理程序如何在.Net中工作?他们先发制人吗?

时间:2016-02-18 19:29:16

标签: c# winforms timer

我有一个短间隔(33毫秒)的WinForm计时器。

我的应用程序中有其他代码可以启用和禁用此计时器。

在timer事件处理程序中,timer.Enabled = true一定是真的吗?或者是否有可能在处理程序开始执行时,另一段代码可能已禁用计时器?

1 个答案:

答案 0 :(得分:5)

  

是否一定是真的,timer.Enabled = true?

是。可以引发Tick事件的唯一方法是当UI线程空闲并且不再执行任何代码时。然后它重新进入调度程序循环以等待另一个通知。如果有任何代码禁用了计时器,则该代码必须在 UI线程空闲之前运行。由于一切都是同步的,因此您很难保证Tick不会再触发。

在工作线程上停止计时器在技术上是有效的。但是,当然你再也没有一个像样的执行订单保证了。在工人上启动计时器是无效的,并且不会达到目的,它根本不会打勾。

请注意System.Timers.Timer,其Elapsed事件在线程池线程上运行,并且可能已被安排在禁用它之前执行。它仍在运行。