在C#中触发事件阻止当前线程执行?

时间:2011-05-09 07:45:40

标签: c# multithreading events event-handling

如果我要解雇这个事件:

var handler = OnMyEvent;

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

然后执行线程将等待,直到所有suscriber方法返回以继续执行line:

之后执行
handler(some_info);

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

2 个答案:

答案 0 :(得分:10)

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

另请注意,像Windows窗体应用程序这样的桌面应用程序中的按钮点击等事件会被放在一个消息队列中,并且会一次触发一个。即如果您按下按钮然后按另一个按钮,第二个按钮事件将不会触发,直到第一个按钮事件完成。此外,表单不会重新绘制并且“无响应”,因为绘制表单也是一个事件。

答案 1 :(得分:2)

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