C# 事件处理程序:何时调用订阅者?
在读了一些文章之后,我认为这里正在发生什么,我只是在寻找确认或更正 下面的示例将使用匿名lambdas以简化说明,显然这样做会使您失去取消订阅的能力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
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