7

私が理解しているように、C# でのメモリ リークの主な原因の 1 つは、コンテナーが破棄されたときにイベント リスナーの登録を解除できないことです。このため、イベント (a など) を手動で登録するときはいつでも、オブジェクト (または親オブジェクト) の操作が完了したTimer.Elapsed += ...ことを確認します。Timer.Elapsed -= ...

しかし、Windows フォーム デザイナで生成されたクラスを調べていたところ、イベント (例: ) を喜んでサブスクライブしている一方で、既定のアクションthis.button1.Click += new System.EventHandler(this.button1_Click);以外にクリーンアップ手順がないように見えることに気付きました。components.Dispose();

Dispose()これは、各コンポーネントのメソッドが、それにバインドされているすべてのイベントから登録解除/登録解除することが期待されていることを意味しますか? もしそうなら、コンポーネントは認識していない「外部」イベントハンドラーからどのように登録解除しますか?これは、標準の [IDisposable] Windows コントロール (タイマー、ボタン、フォームなど) からイベントリスナーを手動で削除しようとする試みが一般的に行われることを意味しますか?不要?

ありがとう

4

3 に答える 3

7

イベント ハンドラーは、イベントを含むオブジェクトがハンドラーを含むオブジェクトよりも長く存続する場合にのみ、メモリ リークを引き起こします。

典型的な WinForms シナリオでは、フォームが開かれている間だけ、コントロールとフォーム コードの両方が有効であるため、そもそも問題はありません。

ハンドラーを静的イベント、シングルトン、またはその他の存続期間の長いオブジェクトから登録解除するだけで済みます。

于 2013-10-29T21:10:17.813 に答える
2

イベント ソースは、サブスクライバーを維持します。フォームがなくなると、GC の対象となり、リスナーが対象になります。

于 2013-10-29T21:11:00.330 に答える