如何在一个事件处理程序中出现异常时继续执行多事件订阅调用
本文关键字:继续 异常 执行 调用 事件 程序 事件处理 一个 | 更新日期: 2023-09-27 17:51:00
这就是我想要完成的。我试图暴露一个类与自定义事件,我已经创建。这个类将被打包在dll中分发给其他人。
现在的需求是,当其他用户尝试多次订阅此事件时,无论任何订阅者中有任何异常,都需要调用所有其他订阅者。
我知道在用户端处理程序中使用try和catch块将确保调用其他块,但是我如何在定义事件的类级别确保这一点呢?是否有一个类似于忽略异常的标志,我可以在类级别设置,以便所有订阅服务器都将被调用,而不管任何订阅服务器抛出异常。
在定义事件的类中,您可以使用它是多播委托的事实并分别调用成员,大致如下:
Delegate[] delegates = myEvent.GetInvocationList();
foreach (Delegate d in delegates)
{
try {
d.DynamicInvoke(sender, args);
} catch {
}
}
一般来说,不隐藏异常是个好主意,如果不向用户显示异常,至少要记录它们
为了做到这一点并保留异常,您可以使用以下方法:
// Extract invocation list and call recursive dispatch:
RecursiveDispatch(0, myEvent.GetInvocationList(), arguments);
private static void RecursiveDispatch(int index, Delegate[] delegates, object[] arguments)
{
if (delegates == null || index >= delegates.Length)
return;
try
{
delegates[index].DynamicInvoke(arguments);
}
catch
{
InternalInvoke(index + 1, delegates, arguments);
throw;
}
InternalInvoke(index + 1, delegates, arguments);
}