当您调用事件时,它们是阻塞还是非阻塞的?

3
假设我有一个名为Tick的事件,我调用它:
public class Test
{
    public event Action Tick;

    public void Test()
    {
         Tick();
         Console.WriteLine("Tick Finished");
    }
}

如果我订阅了大量“Tick”事件,运行Test()的线程是否会被阻塞,直到它们全部被调用,还是会异步执行?


类似的问题:http://stackoverflow.com/questions/1049844/are-public-events-asynchronous-do-they-execute-on-a-separate-thread - HABJAN
事件是阻塞的(意思是它们与调用它们的线程同步运行)。但它们只是委托,所以您可以使用BeginInvoke使它们异步。更多信息请参见此处 - Cody Gray
@Cody Gray:谢谢,为了让其他人更清楚,我想在这种情况下事件是阻塞的。 - Callum Rogers
那么,你的EventHandler在哪里呢?你知道,这样做违反了标准惯例,会让维护你代码的人讨厌你。 - user1228
此外,我们应该停止担心和喜欢重复代码。 - user1228
显示剩余3条评论
2个回答

5

所有事件都是阻塞的。线程执行将被阻塞,直到所有注册到此事件的事件处理程序都已执行。


@Eurgene 我很好奇,如果你接收到3个事件,它会一直处理它们直到完成吗? - Rushino
@Rushino 寻找多播委托 - nin

1

当 Tick() 运行时,它会阻止你通过代码进一步进展。

为了证明这一点,编写一个控制台应用程序来实现这个功能,其中有一堆事件的订阅者,并观察发生了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接