C#WinForms: - 当UI正在执行其他操作时,为什么没有经过Thread Timer tick事件?

时间:2013-10-29 05:12:33

标签: c# multithreading winforms timer

在我的应用程序UI中,我每隔1秒通过Windows计时器更新一个网格。

当我正在做一些其他UI操作属于另一个窗体时,它无法正常工作(这基本上是使用选项卡式)

我添加了Timer_Tick事件的跟踪并登录到文件。

当另一个UI操作正在进行时(打开和关闭另一个窗体),我们发现缺少日志数据。 Timer_Tick此时没有按下。

Log Data trace 有什么建议...? enter image description here

3 个答案:

答案 0 :(得分:4)

问题是UI在单个线程中运行。在该线程上的任何长时间运行的阻塞操作 - 比如打开表单,运行一些代码以响应按钮单击等 - 将阻止计时器触发。这是单线程编程的本质。

如果您绝对需要每秒运行一次代码,无论UI线程中发生了什么,您都需要使用第二个线程。

相关链接:

非常非常重要,可以通过以上任何方式与您的用户界面进行互动:

答案 1 :(得分:4)

{1}} tick事件在UI线程上执行。如果UI线程忙于执行其他操作,那么计时器滴答处理程序将不得不等待。

System.Threading.TimerSystem.Timers.Timer的tick事件发生在线程池线程上,因此它们可以在UI线程忙时执行。如果您需要从tick处理程序更新UI,则可以调用BeginInvoke,并在UI线程空闲时进行UI更新。

无需启动其他线程或执行System.Windows.Forms.Timer循环的BackgroundWorker

答案 2 :(得分:-1)

您可以在BackgroundWorker上运行它,因为它只是每2秒发生一次而无需用户交互。有关BackgroundWorker的更多详细信息,请查看本文“http://www.dotnetperls.com/backgroundworker”,这很容易理解。

BackgroundWorker 使线程易于在Windows窗体中实现。需要在另一个线程上完成密集型任务,因此UI不会冻结。任务完成后,有必要发布消息并更新用户界面。