如何避免计时器滴答中断主线程?

Posted

技术标签:

【中文标题】如何避免计时器滴答中断主线程?【英文标题】:How to avoid timer tick interrupting main thread? 【发布时间】:2015-05-14 03:05:11 【问题描述】:

我有一个计时器,它在滴答作响时会做一些事情。我面临一个问题,当主线程正在处理某些事情并且计时器滴答时,主线程被计时器滴答事件调用的操作中断。

有没有办法编程让主线程中的进程完成,然后只执行定时器滴答事件调用的动作?

谢谢!

【问题讨论】:

但是如果在主线程进程中定时器计时多次怎么办?您可能应该简单地在另一个线程中进行 OnTick 处理。 【参考方案1】:

WinForms TimerTick 事件在 UI 线程上引发,因此事件处理程序在 UI 线程上执行。然后,您可以启动在辅助线程上执行的任务,以保持 UI 线程空闲。但请记住,任何时候您与 UI 交互,例如获取或设置TextBoxText,您必须在UI 线程上进行。

或者,您可以改用System.Timers.Timer 类。默认情况下,它是在辅助线程上引发的 Elapsed 事件,因此不需要额外的工作。如果您设置了SynchronizingObject 属性,那么该事件将在拥有该对象的线程上引发,否则它将在线程池线程上引发。

【讨论】:

以上是关于如何避免计时器滴答中断主线程?的主要内容,如果未能解决你的问题,请参考以下文章

中断主线程并要求它做某事

java界面子线程界面阻塞了主线程界面怎么解决?

使用改造向请求添加标头时如何避免在主线程上等待?

在另一个线程中独立计时 For 循环的每个滴答声的最佳方法

在没有线程阻塞的情况下回调主线程(Java)

如何从主线程超时java线程?