1

1つのサブスクライブパターンと2つの公開パターンを持つ大規模なWPF-MVVMアプリケーションがあります。私は次のようにイベントを購読しました:

EventAggregator.GetEvent<StatusMessageEvent>().Subscribe(OnCommandLineStatusReturned, ThreadOption.UIThread);

コールバックメソッドは次のとおりです。

private void OnCommandLineStatusReturned(StatusMessageEventArgs args)
{
   //some data to display
}

ここで、このイベントを2つの異なるオブジェクトで2回公開する必要があります。

private StatusMessageEventArgs statusMessageEventArgs;
private StatusMessageEventArgs responsestatusMessageEventArgs;

これらのインスタンスをさまざまな時期に公開しましたが、

EventAggregator.GetEvent<StatusMessageEvent>().Publish(statusMessageEventArgs);
EventAggregator.GetEvent<StatusMessageEvent>().Publish(responsestatusMessageEventArgs);

しかし、アプリケーションを実行すると、誤動作します。つまり、10回のうち、2回のコールバックメソッドはまったく呼び出されません。同じサブスクライブで2回公開されたためですか?

4

1 に答える 1

1

次のリンクでこの問題の解決策を入手しました: keepSubscriberReferenceAlive

短期間に複数のイベントを発生させていて、それらのパフォーマンスの問題に気付いた場合は、強力なデリゲート参照をサブスクライブする必要があるかもしれません

デフォルトでは、CompositePresentationEventは、サブスクライバーのハンドラーへの弱いデリゲート参照を維持し、サブスクリプションでフィルターします。これは、CompositePresentationEventが保持する参照が、サブスクライバーのガベージコレクションを妨げないことを意味します。弱いデリゲート参照を使用すると、サブスクライバーはサブスクライブを解除する必要がなくなり、適切なガベージコレクションが可能になります。

この弱いデリゲート参照の維持は、対応する強い参照よりも遅くなります。ほとんどのアプリケーションでは、このパフォーマンスは目立ちませんが、アプリケーションが短期間に多数のイベントを公開する場合は、CompositePresentationEventで強力な参照を使用する必要があります。

サブスクライブ方法を次のように変更しました。

StatusMessageEvent>().Subscribe(OnCommandLineStatusReturned, ThreadOption.UIThread,true);
于 2012-07-16T08:58:55.157 に答える