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

Joh*_*sky 4 c# timer winforms

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

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

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

Han*_*ant 5

timer.Enabled = true一定是真的吗?

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

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

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