如何在一个事件处理程序中出现异常时继续执行多事件订阅调用

本文关键字:继续 异常 执行 调用 事件 程序 事件处理 一个 | 更新日期: 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);
    }