这是我想要完成的。我正在尝试使用我创建的自定义事件公开一个类。此类将分发给包装在 dll 中的其他人。
现在的要求是,当其他用户尝试多次订阅此事件时,无论任何订阅者有任何异常,都需要调用所有其他订阅者。
我知道在用户端的处理程序中使用 try 和 catch 块将确保调用其他块,但是我如何在定义事件的类级别上确保这一点。是否有一个像忽略异常这样的标志,我可以在类级别设置,以便无论任何订阅者抛出异常,都将调用所有订阅者。
这是我想要完成的。我正在尝试使用我创建的自定义事件公开一个类。此类将分发给包装在 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);
}