1

IEventAggregator を取得して、あるモジュールで公開してイベントを実行し、別のモジュールでキャッチできるようにしようとしています。以下のコードを単一のモジュール/プロジェクトで試してみましたが、うまく機能します。1 つのモジュール/プロジェクトでイベントを発行し、別のモジュール/プロジェクトでそれをサブスクライブした場合にのみ失敗します。

Unity を介して IEventAggregator を両方のモジュールに注入しました。

私には 3 つのプロジェクトがあり、そのうちの 2 つにはモジュール (A と B と呼びます) があり、1 つは単なるクラス ライブラリ (インターフェイスと呼びます) です。

クラス ライブラリInterfacesには、次のコードがあります。

public class RandomTestEvent : CompositePresentationEvent<string>
{
}

モジュールAには、ボタン クリック コマンドに次のコードがあります (これは実際にはプロジェクトのビュー モデルにあります)。

var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
evt2.Publish("Testing");

モジュールBには次のコードがあります。

    public void Initialize()
    {
        var evt2 = _eventAggregator.GetEvent<RandomTestEvent>();
        evt2.Subscribe(OnRandomThingDone);
    }

    private void OnRandomThingDone(string obj)
    {
        MessageBox.Show("Random Event Done With: " + obj);            
    }

トレースすると、Subscribe が呼び出されることがわかります。パブリッシュが呼び出されているのを見ると、デバッガーは言いますSubscriptions = 1(サブスクリプションが作成されたことを認識しているため、IEventAggregator の 2 つの異なるインスタンスがないようです)。

ただし、発行後に OnRandomThingDone が呼び出されることはありません。

理由はありますか?(さらにコードを投稿する必要がありますか? その場合はお知らせください。)

4

3 に答える 3

7

Prism の CompositePresentationEvent のデフォルトの動作は、サブスクライバーのターゲット参照を保持するために WeakReferences を使用するため、本当にランダムな推測です。

だから...あなたがkeepSubscriberReferenceAliveを指定してtrueを渡すことができるSubscribeオーバーロードを呼び出してみてください。

サブスクライバーがイベントを正常に受信した場合は、OnRandomThingDone を含むクラスが範囲外になり、イベントが公開される前に GC されたことを意味します。

ランダム API リファレンス: http://msdn.microsoft.com/en-us/library/ff921122(PandP.20).aspx

于 2010-11-15T04:19:14.730 に答える
1

実際、grimcoder は正しいです。弱い参照には public Action メソッドが必要です。週の参照を利用することで、コーダーはイベントへのサブスクライブを解除する必要がなくなります。これは GC によって管理されます。

ただし、true を keepSubscriberReferenceAlive に渡すことで強い参照を使用できます。これにより、短期間に多数のイベントが呼び出される場合にプログラムを高速化することもできます。

詳細については、次を参照してください:第 9 章: 疎結合コンポーネント間の通信セクション強い参照を使用したサブスクライブ

于 2012-01-07T09:52:25.927 に答える
0

Subsriber がアタッチされると参照が終了することはないため、GC とは何の関係もありません。実際の問題は、OnRandomThingDone if MUST be publicにアクセスできないことが原因です。つまり、次のようになります。

**public** void OnRandomThingDone(string obj)
{
    MessageBox.Show("Random Event Done With: " + obj);            
}
于 2010-12-04T07:39:14.737 に答える