3

以下に説明するように、TestEventクラスがあります。

class TestEvent: CompositePresentationEvent<object>
    {
        public void Subscribe(Action<object> action, int number)
        {
            this.Subscribe(action, ThreadOption.PublisherThread, false, arg=>arg.Equals(number));
        }
    }

私がそのようにイベントを購読する場合:

eventAggregator.GetEvent<TestEvent>().Subscribe(_=>MessageBox.Show("Hi"), 3);

イベントは発生しません。しかし、私がそのように購読すると:

eventAggregator.GetEvent<TestEvent>().Subscribe(_ => MessageBox.Show("Hi"), ThreadOption.PublisherThread, false, arg => arg.Equals(3));

それは「発砲」します。概念的には、構文的にも論理的にもどちらも似ています。唯一の違いは、最初のメソッドがイベントクラスのヘルパーメソッドを使用してイベントをサブスクライブすることです。

これは、サブスクライブ呼び出しでkeepSubscriberAlive = true(3番目の引数)を設定すると最初のクラスが機能するため、CompositeEventクラスによって保持されるデリゲートへの弱参照に関連するものであると確信しています。それが生き続けることが何であるかわからないので、私はその解決策だけで行くことはできませんか?イベントに参加したのはクラスですか?もしそうなら、falseを渡さなくてもクラスは生きています。それでは、最初のケースでイベントが発生/処理されないのはなぜですか?

誰かがこの振る舞いを説明できますか?

4

1 に答える 1

3

最初の例では、コードは TestEvent のメソッドに渡される変数をキャプチャします。この場合、コンパイラは数値をラップするクラスを作成する必要があります。TestEvent の Subscribe が呼び出されるたびに、このクラスの新しいインスタンスをインスタンス化する必要があります。

2 番目の例では、キャプチャするデータがないため、Subscribe に渡されるデリゲートを静的にすることができます。この場合、ドメインのアンロード前に存続します。

于 2011-01-30T19:07:53.700 に答える