Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中处理多播委托中的异常?_C#_Exception Handling_Multicastdelegate - Fatal编程技术网

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

如何在C#中处理多播委托中的异常?,c#,exception-handling,multicastdelegate,C#,Exception Handling,Multicastdelegate,我得到了一些通过多播委托调用的代码 我想知道我如何能够赶上和管理那里提出的任何异常,而这些异常目前还没有得到管理。我无法修改给定的代码 我四处寻找,发现需要调用GetInvocationList(),但不确定这是否有用。您可以循环访问在多播列表中注册的所有委托,并在将每次调用包装在try-catch块中时依次调用它们 否则,在代理之后对多播中后续代理的调用(异常情况除外)将中止。使用GetInvocationList考虑代码: foreach (var handler in theEvent.G

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

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


我四处寻找,发现需要调用GetInvocationList(),但不确定这是否有用。

您可以循环访问在多播列表中注册的所有委托,并在将每次调用包装在try-catch块中时依次调用它们


否则,在代理之后对多播中后续代理的调用(异常情况除外)将中止。

使用
GetInvocationList
考虑代码:

foreach (var handler in theEvent.GetInvocationList().Cast<TheEventHandler>()) {
   // handler is then of the TheEventHandler type
   try {
      handler(sender, ...);
   } catch (Exception ex) {
      // uck
   }
}   
它分别调用了将使用调用的每个委托

 theEvent.Invoke(sender, eventArg)
快乐编码



在处理事件时,请记住执行标准的空保护拷贝“n”检查(可能还有锁定)。

投票结果是针对事件的,对于学员,请特别尝试以下扩展方法:

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

你能发布你试过的代码吗?可能是重复的谢谢Jaapjan。那么你的意思是你在做与这个例子相同的事情:这就是要点,是的。在这个主题(现在)和您提到的主题中都有各种各样的例子。在使用这种方法时要非常小心:从性能角度看,这是非常昂贵的。对于一个事件上的10000个事件处理程序,此方法需要20ms,而常规方法需要1ms。对于10000个事件处理程序,使用旧方法需要1900毫秒,而使用旧方法需要6毫秒。您需要考虑这一点,并决定性能成本是否值得。我决定这不是在我的情况下,当调用的委托正在修改事件(添加/删除委托)时,这在某些情况下不能正常工作!我还没有找到解决方法,但是MulticastDelegate本身被实现为一个链表,这使得它比平面数组更能抵抗动态修改。
    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
            }
        }
    }
}