4

メッセージング システムを実装しようとしていますが、通常の .NET イベントを使用しているだけでしたが、発行者がサブスクライバーよりも長く存続し、発行者がサブスクライバーへの参照を保持し、イベントが登録解除されないようにするという問題がありました。

私は弱いイベントを調べていましたが、それらには非常に多くの異なる実装があり、それらについて頭を悩ませていました。シンプルなものが欲しい。

また、それらのほとんどは、参照を保持していない場合でも、イベントをすぐに登録解除しません。オブジェクトの参照がなくなるか範囲外になったら、すぐにイベントの登録を解除するシステムが必要です。

組み込みのイベント シンタックス シュガーを使用せず、代わりに public static クラスを使用して全体の取り組みを容易にすることに問題はありません。

サブスクライバーが使用されなくなった直後に自動的に登録解除される、サブスクライブされたすべてのメソッドを呼び出すイベントを1つのクラスで発生させたいだけです。

これを行うことができますか、または何らかの方法でフレームワークに既に存在していますか?

4

1 に答える 1

0

デリゲートを定義する場合:

public delegate void Callback (string s);

また、パブリッシャークラスがイベントを開催する場合:

public event Callback Notify;

次に、サブスクライバーコンストラクターには登録コードが含まれ、そのクラスにはイベントをサブスクライブする「Update」メソッドが含まれます。

   class Subscriber 
 {
     Publisher publisher;

     public Subscriber (Publisher publisher) 
     {
      this.publisher = publisher;
      publisher.Notify += Update;
     }

    public void Update(string subjectState) 
    {
     state = subjectState;
    }
 }

このサブスクライバーを変更して、イベントが終了するときにイベントから登録解除するには、そのクラスのファイナライザーを実装する必要があります。

~Subscriber () 
 {
   if (publisher != null)
   {
     publisher.Notify -= Update;
   }
 }

これにより、サブスクライバーがイベントに登録されなくなることを確認できます。「ファイナライズ」メソッドの詳細については、「ガベージコレクション」に関する「MSDN」マガジンのこのすばらしい記事をお読みください。

于 2012-11-19T07:37:19.993 に答える