1)您的.NET应用程序中有10个订阅者。一旦调用事件,订阅者是同步还是异步通知?
2)您的.NET应用程序中有10个订阅者。现在一个事件处理程序有一个错误的代码,它会抛出一个异常。其他九个事件处理程序是否还在继续?
谢谢,
答案 0 :(得分:20)
您有10位活动订阅者 你的申请。一旦你调用了 事件,订阅者会收到通知 同步还是异步?
这取决于发布者如何“调用”该事件。在典型情况下(例如,类似C#字段的事件),处理程序只是多播委托的调用列表的成员。调用“事件”等同于调用后备委托,而后者在道德上等同于按顺序调用其每个成员。所以一旦可以查看调用,例如:
MyEvent(this, myEventArgs);
as 类似:
foreach(EventHandler handler in myEventDelegate.GetInvocationList())
handler(this, myEventArgs);
这只是一系列委托调用:订阅者通知同步。当然,发布者可以选择以任何方式调用事件,因此不需要这样做 - 它可能会使用线程池(QUWI / BeginInvoke)或任何其他机制产生异步通知。
您有10位活动订阅者 你的申请。现在一个事件 处理程序有一个错误的代码,它会抛出 一个例外。做其他九个事件 处理程序还在继续?
再次,这取决于。在典型(上述)情况下,答案是否,因为异常不是基于每个订户处理的。如果处理程序抛出,则“foreach”的其余部分将被放弃。当然,没有什么可以阻止发布者在try-catch(ignore)块中包装每个处理程序的调用,或者使用任何其他机制来确保调用所有处理程序。
答案 1 :(得分:4)
答案 2 :(得分:2)
1)没有线程。方法(订阅者)是同步执行的。
2)这取决于。除非处理异常,否则不会执行剩余的订户。除非处理,否则异常总是立即停止代码/线程。这意味着如果在发生异常时执行了10个订阅方法中的2个,那么将不执行重新生成8。
事件只是要调用的方法列表。 .Net在幕后为你做这件事。