1

2つのインスタンス(A、B)が3番目のインスタンス(C)のイベントをリッスンしているセットアップがあります。AにはBへの参照もあります。

イベントがCで発生すると、Aは最初にそれを受け取り、次にBを直接破棄します(設計による)。dispose-methodでは、BはC(-=)のイベントでリスナーを削除します。次に起こることは、BがCでイベントのサブスクライブを解除した場合でも、BはCからのコールバックを受信することです。

呼び出しリストはおそらくイベントが発生したときにのみ構築され(両方のリスナーがまだ存在する場合)、呼び出しループ中に1つのインスタンスがたまたまサブスクライブを解除しても再構築されないため、これは予想されることだと思います。

私の質問は、オブジェクトが実際にまだイベントにサブスクライブしているかどうかにかかわらず、イベントが発生する前に2次チェックがないのはなぜですか?これはパフォーマンスにとって悪いことであり、非常にまれなシナリオだと思います。しかし、この動作を自分で実装したい場合はどうでしょうか。

私はこのようなことを試しましたが、これが必要なすべてであるかどうかはわかりません(ただし、機能しているようです)。呼び出しループはC#の内部ではどのように見えますか?

  foreach(var e in Test.GetInvocationList())
  {
    if (!Test.GetInvocationList().Contains(e)) continue;

    e.DynamicInvoke(this, EventArgs.Empty);
  }
4

1 に答える 1

0

呼び出しリストなどを介したクリーンな方法はありません。

最も簡単なのは、登録を解除するときにBに昔ながらのboolフラグを設定させ、トップレベルのif(unregistered == true)returnを実行させることです。イベントハンドラーで。

于 2011-12-16T10:11:07.977 に答える