Насколько я знаю, если все подписчики событий используют параметр 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);
}
}
затем вместо получения MyEvent
из CompositePresentationEvent
вы получаете его из SynchronousEvent
, что гарантирует вам, что событие будет вызываться синхронно и что вы получите измененное EventArgs
.
person
Adi Lester
schedule
28.06.2012