3

私は Prism 2.1 のデモを作成して、テクノロジーの速度を上げています。Event Aggregation サービスを介して発行およびサブスクライブされた CompositePresentationEvents に問題があります。イベント サブスクリプションは、強い参照 (KeepSubscriberReferenceAlive = true) を設定すると正常に動作しますが、弱い参照 (KeepSubscriberReferenceAlive を省略) を設定すると失敗します。

イベントからの購読解除を管理する必要がないように、弱参照で購読したいと思います。それを行う方法はありますか?ここで強力な参照が必要なのはなぜですか? ご協力いただきありがとうございます!

詳細は次のとおりです。私のデモ アプリはシングル スレッドで、Navigator と Workspace の 2 つの領域と、NavigatorModule、WorkspaceAModule、WorkspaceBModule の 3 つのモジュールがあります。NavigatorModule には、[ワークスペース A を表示] と [ワークスペース B を表示] の 2 つのボタンがあります。これらのボタンのいずれかがクリックされると、ViewRequested という CompositePresentationEvent を発行する ICommand が呼び出されます。このイベントは、どのワークスペース モジュールを表示するかを指定する文字列ペイロードを運びます。

アプリの Infrastructure プロジェクトからのイベント宣言は次のとおりです。

using Microsoft.Practices.Composite.Presentation.Events;

namespace Prism2Demo.Common.Events
{
    public class ViewRequestedEvent : CompositePresentationEvent<string>
    {
    }
}

Navigator モジュールからのイベント パブリッシング コードは次のとおりです。

// Publish ViewRequestedEvent
var eventAggregator = viewModel.Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Publish(workspaceName);

以下は、各ワークスペース モジュールの Initialize() メソッドに含まれるイベント サブスクリプション コードです。

// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);

Subscribe() ステートメントは強い参照で示されています。

ご協力いただきありがとうございます。

4

1 に答える 1

1

いくつかの点を確認してください。

インスタンスがコンテナに正しく登録されていることを確認してください。そうしないと、EventAggregatorインスタンス自体がガベージ コレクションされている可能性があります。

container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());

また、どこかに保持されているサブスクライブされたオブジェクトへの強力な参照があることを確認してthisください (サブスクリプション コード内)。

于 2009-12-14T16:22:00.793 に答える