0

これが私が達成しようとしていることです。作成したカスタムイベントでクラスを公開しようとしています。このクラスは、dll内にラップされた他の人々に配布されます。

ここでの要件は、他のユーザーがこのイベントを複数回サブスクライブしようとしている場合、いずれかのサブスクライバーの例外に関係なく、他のすべてのサブスクライバーを呼び出す必要があることです。

ユーザー側のハンドラー内でtryブロックとcatchブロックを使用すると、他のユーザーが確実に呼び出されることを認識していますが、イベントが定義されているクラスレベルでこれを確実にするにはどうすればよいですか。例外をスローするサブスクライバーに関係なく、すべてのサブスクライバーが呼び出されるようにクラスレベルで設定できる、ignoreexceptionのようなフラグはありますか。

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 に答える