如何在C#中处理多播委托中的exception?

我已经获得了一些我通过多播委托调用的代码。

我想知道如何能够赶上并管理那里提出的任何exception,而目前还没有进行管理。 我无法修改给出的代码。

我一直在环顾四周,发现需要调用GetInvocationList(),但不确定这是否有用。

考虑使用GetInvocationList的代码:

 foreach (var handler in theEvent.GetInvocationList().Cast()) { // handler is then of the TheEventHandler type try { handler(sender, ...); } catch (Exception ex) { // uck } } 

这是我的旧方法,我更喜欢的新方法是因为它使调用变得轻而易举,包括使用out / ref参数(如果需要)。

 foreach (var singleDelegate in theEvent.GetInvocationList()) { try { singleDelgate.DynamicInvoke(new object[] { sender, eventArg }); } catch (Exception ex) { // uck } } 

它单独调用每个将被调用的委托

  theEvent.Invoke(sender, eventArg) 

快乐的编码。


在处理事件时,请记住执行标准的空值保护copy’n’check(也许是锁定)。

您可以循环遍历多播列表中注册的所有委托,并在try-catch块中包含每个调用时依次调用每个委托。

否则,将在具有exception的委托之后对多播中的后续委托的调用将被中止。

upvoted答案是针对事件的,代表们专门尝试这种扩展方法:

  public static class DelegateExtensions { public static void SafeInvoke(this Delegate del,params object[] args) { foreach (var handler in del.GetInvocationList()) { try { handler.Method.Invoke(handler.Target, args); } catch (Exception ex) { // ignored } } } }