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

时间:2011-04-21 06:59:07

标签: c# exception-handling multicastdelegate

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

我想知道我如何能够赶上并管理那里提出的任何异常,而目前尚无法管理。我无法修改给定的代码。

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

3 个答案:

答案 0 :(得分: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)

快乐的编码。


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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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
            }
        }
    }
}