17

私は現在 WPF を学んでおり、弱いイベントの概念に出くわしましたが、「それを理解する」のに本当に苦労しています。私は Stackoverflow に関する数え切れないほどの記事を読み、コード サンプルを見てきましたが、うまく理解できていません。

ここに私のジレンマがあります:

  1. オブジェクトがイベントをサブスクライブする場合、イベントのソースはサブスクライバーへの参照を保持する必要があることを理解しています。
  2. また、サブスクライバーがスコープ外になるか、明示的に破棄されてもイベント ソースが破棄されない場合、イベント ソースはサブスクライバーへの参照を保持しているため、サブスクライバーはガベージ コレクションされないことも理解しています。
  3. これを回避する一般的な方法は、オブジェクトが破棄される前に、ソースからサブスクライバーを明示的にサブスクライブ解除することです。プログラマーがこれがいつ発生するかを判断できない場合、これが問題になる可能性があることを理解しています。

上記から、イベントの使用がメモリリークを引き起こす可能性があることと、弱い参照パターンが必要な理由を理解していますが、理解を妨げているのは、弱いイベントパターンが実際にどのようにこの目標を達成するのですか? それは何が違うのですか?

確かに、イベントを管理するクラスがある場合でも、ハンドラーをソースにサブスクライブおよびサブスクライブ解除する必要があるため、参照が存在する必要があり、イベントを使用する標準的な方法で同じ問題が発生します。

誰かが私に欠けている、または誤解している基本的な概念を説明して、弱いイベントパターンを「理解」するのを手伝ってください。

4

1 に答える 1

18

あなたが見逃しているのは、弱いイベント (カバーの下で弱い参照を使用し、次にGCHandleを使用する) が、オブジェクトへの強い参照を保持せずにオブジェクトにアクセスする必要があるという特定のケースで、組み込みの CLR 動作を利用していることです。つまり、アプリケーション コードが従う通常の「規則」によって制約されません。

http://sankarsan.wordpress.com/2008/08/09/weak-references/を参照

舞台裏では、WeakEventManager はイベント サブスクライバーへの弱参照を保持しています。イベントが発生する前にサブスクライバーがたまたま GC された場合、WeakEventManager は肩をすくめて、「OK、あの男は死んでしまった。今後はこのイベントを彼に通知するのをやめるだけだ」と言います。

于 2012-05-09T19:28:06.630 に答える