3

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

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

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

当另一个 UI 操作正在进行时(打开和关闭另一个窗体),我们发现日志数据丢失。Timer_Tick 此时未命中。

日志数据跟踪 有什么建议么...? 在此处输入图像描述

4

3 回答 3

5

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

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

相关链接:

非常重要的是,对于从上述任何一种方式与您的 UI 进行交互:

于 2013-10-29T05:29:58.147 回答
4

System.Windows.Forms.Timer滴答事件在 UI 线程上执行。如果 UI 线程忙于做其他事情,那么计时器滴答处理程序将不得不等待。

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

无需启动不同的线程或BackgroundWorker执行Sleep循环的线程。

于 2013-10-29T15:28:23.647 回答
-1

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

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

于 2013-10-29T05:40:58.747 回答