面试问题:事件处理程序中的异常

Hou*_*man 8 .net c# events exception

1)您的.NET应用程序中有10个订阅者.一旦调用事件,订阅者是同步还是异步通知?

2)您的.NET应用程序中有10个订阅者.现在一个事件处理程序有一个错误的代码,它会抛出一个异常.其他九个事件处理程序是否还在继续?

谢谢,

Ani*_*Ani 20

您的应用程序中有10个订阅者.一旦调用事件,订阅者是同步还是异步通知?

这取决于发布者如何"调用"该事件.在典型情况下(例如,类似C#字段的事件),处理程序只是多播委托的调用列表的成员.调用"事件"等同于调用支持委托,这反过来在道德上等同于按顺序调用其每个成员.所以一旦可以查看调用,例如:

MyEvent(this, myEventArgs);
Run Code Online (Sandbox Code Playgroud)

类似到:

foreach(EventHandler handler in myEventDelegate.GetInvocationList())
    handler(this, myEventArgs);
Run Code Online (Sandbox Code Playgroud)

它只是一系列委托调用:订阅者同步通知.当然,发布者可以选择以任何方式调用事件,因此不需要这样做 - 它可能使用线程池(QUWI/BeginInvoke)或任何其他产生异步通知的机制.

您的应用程序中有10个订阅者.现在一个事件处理程序有一个错误的代码,它会抛出一个异常.其他九个事件处理程序是否还在继续?

再次,这取决于.在典型的(上述)情况下,答案是否定的,因为异常不是基于每个订户处理的.如果处理程序抛出,则"foreach"的其余部分将被放弃.当然,没有什么可以阻止发布者在try-catch(ignore)块中包装每个处理程序的调用,或者使用任何其他机制来确保调用所有处理程序.