C# 计时器事件处理程序在.Net中如何工作?他们先发制人吗?

C# 计时器事件处理程序在.Net中如何工作?他们先发制人吗?,c#,winforms,timer,C#,Winforms,Timer,我有一个短时间间隔(33毫秒)的WinForm定时器 我的应用程序中还有其他代码可以启用和禁用此计时器 在计时器事件处理程序中,timer.Enabled=true是否一定是真的?或者,在处理程序开始执行时,另一段代码可能已经禁用了计时器 timer.Enabled=true是否一定是真的 对。引发勾号事件的唯一方法是当UI线程处于空闲状态并且不再执行任何代码时。然后,它重新进入dispatcher循环以等待另一个通知。如果有任何代码禁用计时器,那么在UI线程空闲之前,必须运行该代码。因为一切都

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

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

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

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

对。引发勾号事件的唯一方法是当UI线程处于空闲状态并且不再执行任何代码时。然后,它重新进入dispatcher循环以等待另一个通知。如果有任何代码禁用计时器,那么在UI线程空闲之前,必须运行该代码。因为一切都是同步的,所以你很难保证滴答声不会再响了

停止工作线程上的计时器在技术上是有效的。但当然,你不再有一个像样的执行令保证了。在工作者身上启动计时器是无效的,不会有好的结果,它根本不会滴答作响


当心System.Timers.Timer,它的已用事件在线程池线程上运行,可能在禁用它之前已计划执行。它仍在运行。

对查找可能的竞争条件感兴趣。设置timer.Enabled=false不会停止处理程序中正在运行的代码的执行。感谢您提供的详细答案。