0

这是我想要完成的。我正在尝试使用我创建的自定义事件公开一个类。此类将分发给包装在 dll 中的其他人。

现在的要求是,当其他用户尝试多次订阅此事件时,无论任何订阅者有任何异常,都需要调用所有其他订阅者。

我知道在用户端的处理程序中使用 try 和 catch 块将确保调用其他块,但是我如何在定义事件的类级别上确保这一点。是否有一个像忽略异常这样的标志,我可以在类级别设置,以便无论任何订阅者抛出异常,都将调用所有订阅者。

4

2 回答 2

2

在定义事件的类中,您可以使用它是多播委托这一事实并分别调用成员,大致如下:

 Delegate[] delegates = myEvent.GetInvocationList();
 foreach (Delegate d in delegates)
 {
     try {
         d.DynamicInvoke(sender, args);
     } catch {
     }
 }

一般来说,永远不要隐藏异常是个好主意,如果不向用户显示它们,至少记录它们

于 2013-01-07T23:35:21.023 回答
0

为了做到这一点并保留异常,您可以使用以下方法:

    // 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);
    }
于 2013-01-07T23:46:44.817 回答