2017-09-06 14 views
0

私はWPFアプリケーションでC#のコードに従っており、イベントを切り離す際に質問があります。イベントを切り離す

public class Publisher 
{ 
    public event EventHandler Completed; 
    public void Process() 
    { 
        // do something 
        if (Completed != null) 
        { 
            Completed(this, EventArgs.Empty); 
        } 
    } 
} 

public class Subscriber 
{ 
    public void Handler(object sender, EventArgs args) { } 
} 

使用法:私はハンドラメソッドを解除して、アプリケーション内の任意のメモリリークの原因となる、次のコード行を使用してnullにオブジェクトを設定していけない場合

Publisher pub = new Publisher(); 
Subscriber sub = new Subscriber(); 
pub.Completed += sub.Handler; 
// this will invoke the event 
pub.Process(); 

ここに私の質問は、ありますか?

pub.Completed -= sub.Handler 
pub=null;sub=null; 
+0

いいえ、そのスニペットではありません。 Publisherオブジェクトは、コードを含むメソッドのローカル変数によってのみ参照されます。したがって、pub.Publish()が完了するとすぐに、両方のオブジェクトを同時にガベージコレクションできます。購読者をずっと長くしている出版社は、もっと厄介なシナリオです。 –

答えて

1

イベントハンドラが登録している間、イベントの発行者は、(デリゲートを仮定すると、インスタンスメソッドである)イベントハンドラデリゲートを介して加入者への参照を保持しています。

パブリッシャがサブスクライバよりも長生きすると、サブスクライバへの他の参照がなくてもサブスクライバが有効になります。

同等のハンドラでイベントを登録解除してからyesを選択すると、ハンドラとリークの可能性がなくなります。

これはanswer to a previous questionとして見つけられました。したがって、私はそれを信用できません。

0

は、代表者が解除する必要がありますときには判断できない場合WeakEventManagerの利用をご検討くださいマックスプリングル

に同意します。

関連する問題