1. ホーム
  2. c#

[解決済み] イベントハンドラのメモリリークを回避する理由と方法とは?

2022-04-20 01:04:51

質問

StackOverflowのいくつかの質問と回答を読んで、イベントハンドラを追加する際に += C#(あるいは他の.net言語)において、一般的なメモリリークを引き起こす可能性があります...。

私は過去に何度もこのようなイベントハンドラを使用してきましたが、自分のアプリケーションでメモリリークを引き起こす可能性がある、または引き起こしたことがあるとは思いもよりませんでした。

これはどのような仕組みなのでしょうか(つまり、なぜ実際にメモリリークが発生するのでしょうか)?

この問題はどうすれば解決できますか?この問題を解決するには -= を同じイベントハンドラに追加するだけでよいのでしょうか?

このような状況を処理するための共通のデザインパターンやベストプラクティスはありますか?

例:多くの異なるスレッドを持ち、多くの異なるイベントハンドラを使ってUI上の複数のイベントを発生させるアプリケーションをどのように扱えばいいのでしょうか?

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

解決方法は?

原因は簡単に説明すると、イベントハンドラをサブスクライブしている間に パブリッシャー への参照を保持します。 サブスクライバ イベントハンドラのデリゲート(デリゲートがインスタンスメソッドであることを仮定)を通じて

もしパブリッシャーがサブスクライバーよりも長生きするならば、サブスクライバーへの参照が他にないときでも、サブスクライバーを存続させるでしょう。

もし、同等のハンドラを持つイベントの登録を解除した場合、そのハンドラを削除することになり、リークの可能性があります。しかし、私の経験では、これが問題になることはほとんどありません。なぜなら、通常、パブリッシャーとサブスクライバーの寿命は、いずれにしてもほぼ等しいと思うからです。

それは しかし、私の経験では、それはむしろ誇張されすぎています。もちろん、あなたのマイレージは異なるかもしれません...ただ、あなたは注意する必要があります。