4

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

我想知道如何赶上并管理那里提出的任何异常,而这目前还没有得到管理。我无法修改给定的代码。

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

4

3 回答 3

4

考虑使用代码GetInvocationList

foreach (var handler in theEvent.GetInvocationList().Cast<TheEventHandler>()) {
   // 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)

快乐编码。


记住在处理事件时执行标准的 null-guard copy'n'check(可能还有锁定)。

于 2011-04-21T07:09:14.510 回答
2

您可以遍历多播列表中注册的所有代表,并依次调用它们中的每一个,同时将每个调用包装在一个 try-catch 块中。

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

于 2011-04-21T07:04:31.180 回答
0

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

    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
            }
        }
    }
}
于 2016-02-17T15:19:39.183 回答