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

时间:2011-02-19 23:53:31

标签: c# .net events exception

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

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

谢谢,

3 个答案:

答案 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)

  1. Synchronously, by default。但是,有可能invoke asynchronousl y。
  2. 不,异常会冒泡到事件源 - 这会崩溃。同样,通过在try / catch中单独调用每个处理程序,可以change that behavior

答案 2 :(得分:2)

1)没有线程。方法(订阅者)是同步执行的。

2)这取决于。除非处理异常,否则不会执行剩余的订户。除非处理,否则异常总是立即停止代码/线程。这意味着如果在发生异常时执行了10个订阅方法中的2个,那么将不执行重新生成8。

事件只是要调用的方法列表。 .Net在幕后为你做这件事。