17

WindowsBaseDLLは、IWeakEventListener要約を使用してイベントを定義します。

WeakEventパターンとSystem.Windows.WeakEventManagerを介してイベントを受信することを期待するクラスにイベントリスニングサポートを提供します。

この漠然とした説明は、「WeakEventパターン」が実際に何であるかを説明していません。

では、このパターンとは何ですか、なぜそれが使用され、WPFアプリケーションの外部で役立つのでしょうか?

編集すでにいくつかの良い答えがありますが、このパターンがWPFアプリケーションの外部で役立つかどうかについては誰も話していません。依存関係のプロパティのような弱いイベントパターンは、WPFAPIおよびDLLと密接に関連しているように思われます。非WPFアプリケーションで利用できる同等の実装はありますか?

4

3 に答える 3

25

重要な点は備考にあります。

WeakEvent パターンに従う主な理由は、イベント ソースのオブジェクトの有効期間がイベント リスナーから独立している可能性がある場合です。WeakEventManager の中央イベント ディスパッチを使用すると、ソース オブジェクトが存続している場合でも、リスナーのハンドラーをガベージ コレクションできます。

オブジェクトがある場合publisher、通常、のイベントをサブスクライブした後は、ガベージ コレクションを実行できません。弱いイベント パターンは、この依存関係がないように、2 つの間のリンクを "弱い" ( WeakReferenceのように) にします。(別の方法として、ガベージ コレクションの対象になりたい場合は、イベントのサブスクライブを解除することもできますが、それでは面倒です。)subscribersubscriberpublishersubscribersubscriber

于 2009-02-05T16:23:51.590 に答える
11

WeakEventパターン

イベントをサブスクライブすると、サブスクライバーが収集されない可能性があります。オブジェクトへの他の参照を保持していないため、オブジェクトが収集されると想定します-ただし、イベントパブリッシャーはリスナーオブジェクトを保持し、メモリに保持します(明示的にサブスクライブを解除しない限り、その場合は正確にいつ知る必要があります)退会するには)。管理されたリーク。

経験則として、イベントパブリッシャーがリスナーよりも長くハングアウトする場合は、この問題が発生する可能性があるため、これを確認する必要があります。

WeakEventsは、オブジェクトへのアクティブな参照が「Weak」のみである場合にオブジェクトが収集されるという点で、ここで役立ちます。このパターンに注意する必要があるのは、通常は多くのイベントを公開する新しいコントロールを開発する場合のみです。

基本的な考え方は、WeakReferencewrtガベージコレクションに似ています。

于 2009-02-05T16:27:23.797 に答える