2016-11-30 6 views
2

コントローラでイベントを購読するときに、購読を解除する必要はありますか?メモリリークの原因を解除することはありませんか?なぜ/なぜですか?まずMVCコントローラのイベント購読

[HttpPost] 
    public JsonResult Process(string data) 
    { 
     DataProcessor.Notify += (sender, args) => 
     { 
      result = JsonConvert.SerializeObject(args); 
     }; 

     .. // do other work 

     return Json(result); 
    } 
+0

[イベントから退会する必要がありますか?](http://stackoverflow.com/questions/4172809/should-i-subscribe-from-events) – Aravind

答えて

2

、最良かつ最も安全なプラクティスは、IMO 常に退会にあります。

この特定のシナリオでは、あなたのコントローラーがあなたの(私が推測した)静的なDataProcessorクラスよりも短い寿命を持つため、確実に退会する必要があります。短い生存オブジェクトが長い生存ライブラリーにサブスクライブするたびに、長いライブオブジェクトのイベントデリゲートリストに短い生存オブジェクトの参照が保持されるため、メモリリークが発生する可能性が最も高くなります。

コントローラのDisposeメソッドでの退会をお勧めします。

DataProcessorが静的​​クラスではなくコントローラのフィールドである場合は、そのオブジェクトの有効範囲を確認する必要があります。このコントローラーインスタンスの専用インスタンスの場合、2つのオブジェクトがGCdである可能性が最も高いため、サブスクライブ解除は省略できます。

関連する問題