经过阅读,我认为这是正在发生的事情,我只是在寻求确认或更正。
为了简洁起见,下面的示例将使用匿名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
}
因此,这里是我需要纠正/澄清/指导的地方。据我所知,调用处理程序的有效作用是(我知道它并没有完全做到这一点,这只是为了说明目的)。
foreach(var subscriber in self){
subscriber(sender, args);
}
我明确地不是在谈论将其与BeginInvoke
一起使用。因此,调用处理程序基本上会导致处理程序以某种未定义的顺序循环通过其所有订阅者,并调用它们,从调用线程传递适当的args(在本例中,再次不讨论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");
我们总是可以期望输出是(因为我们的订阅者都不是异步的,并且我们没有使用BeginInvoke):
// some undefined order of the following 3 lines:
One
Two
Three
// Always followed by
Done Invoking Subscribers
一般来说,我的想法对吗?
是
很抱歉这么直接,但简单的答案是肯定的,这就是它的工作原理。