事件处理程序是否保证在UI线程上运行

时间:2015-08-18 10:28:50

标签: c# winforms

事件处理是否像这样

notifyIcon.BalloonTipClosed += new EventHandler(delegate(Object sender, EventArgs e)
{
     // ...
});

保证在UI线程上运行,因此我不需要调用InvokeBeginInvoke方法来更新控件?

提前致谢。

3 个答案:

答案 0 :(得分:4)

是的,他们是。

用户界面事件是由消息队列中的消息引起的,它是运行处理消息的消息泵的UI线程。

来自System.Timers.Timer class的事件不会在UI线程中运行,因为它不是与UI相关的事件。来自System.Windows.Forms.Timer class的事件将在UI线程中运行,因为它设计为在窗口中运行并使用事件的消息队列。

答案 1 :(得分:2)

与UI关联的事件处理程序在UI线程(桌面应用程序的主线程)上运行。这就是在某些情况下您的UI可能被冻结的原因。发生这种情况是因为事件处理程序的代码在这些情况下需要执行太多操作。出于这个原因,我们采用了异步编程的范例。因此,当我们必须等待I / O或与网络相关的任务完成时,它不需要由UI线程来完成。这可以通过另一个线程来完成。这样做,我们避免冻结UI。

答案 2 :(得分:1)

要清楚 - UI对象引发的事件的事件处理程序应该是。事件处理程序,一般,编号

E.g。不会在UI线程上调用NetworkAvailabilityChanged的事件处理程序。

但是在例如System.Windows.Forms命名空间的类中,是的,它们应该是。