在我的应用程序UI中,我每隔1秒通过Windows计时器更新一个网格。
当我正在做一些其他UI操作属于另一个窗体时,它无法正常工作(这基本上是使用选项卡式)
我添加了Timer_Tick事件的跟踪并登录到文件。
当另一个UI操作正在进行时(打开和关闭另一个窗体),我们发现缺少日志数据。 Timer_Tick此时没有按下。
有什么建议...?
答案 0 :(得分:4)
问题是UI在单个线程中运行。在该线程上的任何长时间运行的阻塞操作 - 比如打开表单,运行一些代码以响应按钮单击等 - 将阻止计时器触发。这是单线程编程的本质。
如果您绝对需要每秒运行一次代码,无论UI线程中发生了什么,您都需要使用第二个线程。
相关链接:
非常非常重要,可以通过以上任何方式与您的用户界面进行互动:
答案 1 :(得分:4)
{1}} tick事件在UI线程上执行。如果UI线程忙于执行其他操作,那么计时器滴答处理程序将不得不等待。
System.Threading.Timer和System.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不会冻结。任务完成后,有必要发布消息并更新用户界面。