C# 事件处理程序:何时调用订阅者?

C# 事件处理程序:何时调用订阅者?,c#,multithreading,events,event-handling,C#,Multithreading,Events,Event Handling,在读了一些文章之后,我认为这里正在发生什么,我只是在寻找确认或更正 下面的示例将使用匿名lambdas以简化说明,显然这样做会使您失去取消订阅的能力 MyEvent += (sender, args) => {Console.WriteLine("One")}; MyEvent += (sender, args) => {Console.WriteLine("Two")}; MyEvent += (sender, args) => {Console.WriteLine("Thr

在读了一些文章之后,我认为这里正在发生什么,我只是在寻找确认或更正

下面的示例将使用匿名lambdas以简化说明,显然这样做会使您失去取消订阅的能力

MyEvent += (sender, args) => {Console.WriteLine("One")};
MyEvent += (sender, args) => {Console.WriteLine("Two")};
MyEvent += (sender, args) => {Console.WriteLine("Three")};
在订阅服务器就位后,我们将调用事件:

var handler = MyEvent;
if(handler != null){
    handler(this, EventArgs.Empty) // <-- Interested in this moment
}
我明确地说,这并不是在
BeginInvoke
中使用。因此,基本上,调用处理程序会导致处理程序以未定义的顺序遍历其所有订阅者,并通过调用线程传递适当的参数来调用订阅者(在本例中,再次不讨论
BeginInvoke

换句话说,
handler(this,EventArgs.Empty)
基本上只是在调用线程上立即执行此操作:

anonymous1(..., ...)
anonymous2(..., ...)
anonymous3(..., ...)
稍微修改上述内容:

var handler = MyEvent;
if(handler != null){
    handler(this, EventArgs.Empty) // <-- Interested in this moment
}

Console.WriteLine("Done Invoking Subscribers");
一般来说,我的想法正确吗?

是的
很抱歉这么直截了当,但简单的答案是肯定的,这就是它的工作原理。

这正是我想要的,简单的答案!=)谢谢我必须再等5分钟才能将答案标记为正确。有时最好的答案很简单:)
var handler = MyEvent;
if(handler != null){
    handler(this, EventArgs.Empty) // <-- Interested in this moment
}

Console.WriteLine("Done Invoking Subscribers");
// some undefined order of the following 3 lines:

One
Two
Three

// Always followed by
Done Invoking Subscribers