关于多线程:C#中的触发事件是否会阻止当前线程执行?

Do firing events in C# block the current thread execution?

如果我要触发事件:

1
2
3
4
5
6
var handler = OnMyEvent;

if (handler != null)
{
    handler(some_info);
}

然后,执行线程将等待,直到所有订阅者方法返回以继续执行以下行:

1
handler(some_info);

或者"在另一个线程中"触发事件,这意味着事件自动转到handler(some_info)之后的下一行?


事件在同一线程上触发,它将阻塞直到事件完成。当然,事件处理代码本身可以产生另一个线程并立即返回,但这是完全不同的事情。

还请注意,诸如Windows Forms应用程序之类的桌面应用程序中的按钮单击之类的事件被置于消息队列中,并且一次将触发一次。也就是说,如果您按下一个按钮,然后再按下另一个按钮,则第二个按钮事件在第一个按钮事件完成之前不会触发。此外,该表单将不会重新绘制,并且会"不响应",因为绘制表单也是一个事件。


在引发事件的线程中触发事件。