在我的应用程序 UI 中,我每 1 秒通过 Windows 计时器滴答更新一个网格。
当我做一些其他的 UI 操作属于另一个 Windows 窗体时它不能正常工作(这基本上是使用选项卡式窗体)
我为 Timer_Tick 事件添加了跟踪并登录到文件。
当另一个 UI 操作正在进行时(打开和关闭另一个窗体),我们发现日志数据丢失。Timer_Tick 此时未命中。
有什么建议么...?
在我的应用程序 UI 中,我每 1 秒通过 Windows 计时器滴答更新一个网格。
当我做一些其他的 UI 操作属于另一个 Windows 窗体时它不能正常工作(这基本上是使用选项卡式窗体)
我为 Timer_Tick 事件添加了跟踪并登录到文件。
当另一个 UI 操作正在进行时(打开和关闭另一个窗体),我们发现日志数据丢失。Timer_Tick 此时未命中。
有什么建议么...?
问题是 UI 在单个线程中运行。该线程上任何长时间运行的阻塞操作(例如打开表单、运行一些代码以响应按钮单击等)都会阻止计时器触发。这就是单线程编程的本质。
如果您绝对需要每秒运行代码,无论 UI 线程中发生什么,您都需要使用第二个线程。
相关链接:
非常重要的是,对于从上述任何一种方式与您的 UI 进行交互:
System.Windows.Forms.Timer
滴答事件在 UI 线程上执行。如果 UI 线程忙于做其他事情,那么计时器滴答处理程序将不得不等待。
System.Threading.Timer和System.Timers.Timer的滴答事件发生在线程池线程上,因此它们可以在 UI 线程忙时执行。如果您需要从刻度处理程序更新 UI,您可以调用BeginInvoke,UI 更新将在 UI 线程空闲时发生。
无需启动不同的线程或BackgroundWorker
执行Sleep
循环的线程。
您可以在 BackgroundWorker 上运行它,因为它每 2 秒发生一次,无需用户交互。有关 BackgroundWorker 的更多详细信息,请查看这篇文章“ http://www.dotnetperls.com/backgroundworker ”,非常容易理解。
BackgroundWorker使线程易于在 Windows 窗体中实现。密集的任务需要在另一个线程上完成,这样 UI 才不会冻结。任务完成后,有必要发布消息并更新用户界面。