据我所知,如果所有事件订阅者都使用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;
}
如果您知道应该始终同步调用事件,您可以创建自己的事件基类(而不是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,而是从SynchronousEvent 派生它,这将保证您将同步调用该事件并且您将获得修改后的EventArgs。