3

.NET WinForms アプリで興味深い動作に気付きました。多くの MDI 子が追加された MDI フォームがあります。これらの子フォームは、本質的にそれ自体を更新するための呼び出しである「ブロードキャスト」イベントをリッスンします。イベントは基本クラスで宣言され、リッスン イベントは子フォームに追加されます。

Dispose() メソッドでイベントが明示的に削除されていない場合、これらの子フォームが閉じられていても、イベントがまだヒットしていることに気付きました。

この背後にある理由は何ですか?フォームが閉じている場合は、イベントを切り離す/破棄する必要がありますか? 実際のイベント自体が外部クラスで宣言されているためですか?これは私が推測しているものです。

洞察をいただければ幸いです。

(C#、.NET 3.5 を使用)

4

4 に答える 4

1

はい、これは設計による動作であり、 WeakEventパターンが考案された理由でもあります。

于 2009-07-15T14:34:59.800 に答える
0

イベント サブスクリプションは、子フォームへの参照として「カウント」されます。(そのため、子フォームもガベージ コレクションされません)。

何が起こっているかを確認するには、デリゲートのヘルプを調べてください。サブスクライバーを指す (オブジェクト型の) Target というメンバーがあります。したがって、参照チェーンはまだ有効です。

MDI 親 (イベント発行者) --> デリゲート --> 子フォーム。

Dispose() でイベント サブスクリプションをクリーンアップする必要があります。そうしないと、子フォームがガベージ コレクションの対象になりません。

Web で「weak ref events」を検索すると、weak イベントを定義するために投稿された多くの回避策が見つかります。以下は一例です: http://www.codeproject.com/KB/cs/weakeeventhandlerfactory.aspx

私もプロトタイプを作成しなければなりませんでした。よろしければ共有させていただきます。ただし、私のアドバイスは、通常のイベントに固執し、Dispose() でクリーンアップすることです。

于 2009-07-15T14:37:00.250 に答える