【发布时间】:2014-02-28 16:31:44
【问题描述】:
我有一个与我的主窗体关联的 System.Windows.Forms.Timer。我需要这个计时器每 1000 毫秒触发一次,以便可以执行一些工作。 Timer.Enabled 属性在 Form.Shown 事件中设置为 true,间隔设置为 1000。
Timer.Tick 事件在大多数情况下大约每秒触发一次。但是,当我的应用程序执行 foreach 语句时,Tick 事件会停止触发。我试过 Thread.Sleep ,但是没有帮助。有没有人有什么建议?处理我的 Timer.Tick 事件的代码包含异常处理,并且我已验证在执行 foreach 块期间该事件在调试器中停止触发。此外,我的应用程序此时不是多线程的。有什么建议吗?
【问题讨论】:
-
请发布代码。
-
如果您在循环中保持 UI 线程忙碌,那么不,计时器
Tick处理程序将无法执行。如果您有一个长时间运行的循环,请将其推送到后台线程。Sleep无济于事,因为这也会阻塞 UI 线程。还有其他计时器不会在 UI 线程 (System.Timer) 上触发,但如果您的 tick 需要访问 UI,那么如果 UI 线程仍然很忙,这实际上对您没有帮助。 -
现在多线程你的应用程序...
-
谢谢,我会重新考虑使用后台线程。我知道我可能在做一些愚蠢的事情。如果您发布您的答案 Matt Burland,我会在稍后接受答案。
-
Application.DoEvents在你的循环中会有所帮助,但它是一个廉价的修复。您可以在另一个线程中执行循环,因为它当前正在阻止 UI 线程执行,而这正是发生滴答事件的地方。后台工作人员可以帮助您做到这一点:msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx