2011-01-30 4 views
3

で指定された匿名のフィルタデリゲートで発生しません:プリズムCompositeEvent後述するように、私は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クラスによって保持されているデリゲートへの弱い参照に関連するものと確信しています。私はそれが生き続けることが何であるか分からないので、私はその解決策と一緒に行くことができませんか?イベントに登録したクラスになりますか?そうであれば、クラスは偽を渡さなくても生きています。なぜ、最初のケースでイベントが発生/処理されないのですか?

誰でもこの動作を説明できますか?

答えて

3

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

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

関連する問題