私の知る限りでは、すべてのイベントの加入者は、(デフォルトでもある)ThreadOption.PublisherThread
オプションを使用している場合、イベントは同期的に実行され、加入者はEventArgs
オブジェクトを変更することができますので、あなたが出版社に持っている可能性があり
myEventAggregator.GetEvent<MyEvent>().Publish(myParams)
if (myParams.MyProperty)
{
// Do something
}
加入者コードは次のようになります。
// Either of these is fine.
myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod)
myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod, ThreadOption.PublisherThread)
private void MySubscribedMethod(MyEventArgs e)
{
// Modify event args
e.MyProperty = true;
}
あなたはイベントが常に同期的に呼び出されるべきであることがわかっている場合は、あなたがあなた自身のベースCLASを作成することができます(CompositePresentationEvent<T>
の代わりに)Subscribe
メソッドをオーバーライドし、サブスクライバーがThreadOption.PublisherThread
オプションのみを使用できるようにします。それはこのようになります:
public class SynchronousEvent<TPayload> : CompositePresentationEvent<TPayload>
{
public override SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate<TPayload> filter)
{
// Don't allow subscribers to use any option other than the PublisherThread option.
if (threadOption != ThreadOption.PublisherThread)
{
throw new InvalidOperationException();
}
// Perform the subscription.
return base.Subscribe(action, threadOption, keepSubscriberReferenceAlive, filter);
}
}
を、代わりにCompositePresentationEvent
からMyEvent
を導出するのは、イベントを同期的に呼び出されることを保証するであろうと、あなたが変更しEventArgs
を取得すること、SynchronousEvent
からそれを引き出します。
あなたの返事をありがとう、私はあなたのポイントを理解することができた、私はEventArgsを介してデータを返し、それは動作します。記録のために、メソッド 'SubscriptionToken'は' virtual'ではないので、私は 'SyncronousEvent'クラスを作成できませんでした。 Howerverあなたの質問は私に非常に有用だった。 – Dante
@Dante 'SubscriptionToken'ではなく、' Subscribe'メソッド(これは仮想です)をオーバーライドしています。 –
申し訳ありませんが、私の悪い、私は方法の 'バーチャルではない購読'について話していた、私はそれを今見ているとあなたの例をコンパイルしようとするとVS2010は、とにかく、あなたの解決策は、私が探していたものです。ありがとうございます。 – Dante