如何在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
}
}
}
}