イベントハンドラのメモリリークを回避する理由と方法 質問する

イベントハンドラのメモリリークを回避する理由と方法 質問する

StackOverflow でいくつかの質問と回答を読んで、C# (またはおそらく他の .net 言語) を使用してイベント ハンドラーを追加すると、一般的なメモリ リークが発生する可能性があることに気付きました+=...

私はこれまで何度もこのようなイベント ハンドラーを使用してきましたが、それがアプリケーションでメモリ リークを引き起こす可能性があること、または実際に引き起こしたことがあることにはまったく気づきませんでした。

これはどのように機能するのでしょうか (つまり、なぜ実際にメモリ リークが発生するのでしょうか)?
この問題を修正するにはどうすればよいですか?-=同じイベント ハンドラーを使用するだけで十分ですか?
このような状況を処理するための一般的な設計パターンやベスト プラクティスはありますか?
例: 多くの異なるスレッドがあり、多くの異なるイベント ハンドラーを使用して UI で複数のイベントを発生させるアプリケーションをどのように処理すればよいですか?

すでに構築された大規模なアプリケーションでこれを効率的に監視するための、優れた簡単な方法はありますか?

ベストアンサー1

原因は簡単に説明できます。イベントハンドラがサブスクライブされている間、出版社イベントの参照は加入者イベント ハンドラー デリゲートを介して (デリゲートがインスタンス メソッドであると想定)。

パブリッシャーがサブスクライバーよりも長く存続する場合、サブスクライバーへの他の参照がない場合でも、サブスクライバーは存続したままになります。

同等のハンドラーを使用してイベントのサブスクライブを解除すると、ハンドラーとリークの可能性が削除されます。ただし、私の経験では、これが実際に問題になることはほとんどありません。通常、パブリッシャーとサブスクライバーの有効期間はほぼ同じであるためです。

それ考えられる原因ですが、私の経験では、かなり誇張されています。もちろん、状況は人によって異なる可能性があります。注意が必要です。

おすすめ記事