Por lo que yo sé, si todos los suscriptores de eventos están utilizando la opción ThreadOption.PublisherThread
(que es la opción por defecto), el evento se lleva a cabo de forma sincronizada y los abonados pueden modificar el objeto EventArgs
, por lo que podría tener en el editor
myEventAggregator.GetEvent<MyEvent>().Publish(myParams)
if (myParams.MyProperty)
{
// Do something
}
el código de abonado se vería así:
// 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;
}
Si sabe que el evento siempre se debe llamar de forma sincrónica, puede crear sus propias bases clas s para eventos (en lugar de CompositePresentationEvent<T>
) que anula el método Subscribe
, y solo permite a los suscriptores usar la opción ThreadOption.PublisherThread
. Se vería algo como esto:
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);
}
}
entonces en vez de derivar MyEvent
de CompositePresentationEvent
, que derivarla de SynchronousEvent
, lo que le garantiza que el evento se llamará de forma sincrónica y que obtendrá la EventArgs
modificado.
Gracias por su respuesta, pude entender su punto, devuelvo los datos a través de EventArgs y funciona. Solo para el registro, no pude crear la clase 'SyncronousEvent' ya que el método' SubscriptionToken' no es 'virtual'. Howerver tu pregunta fue muy útil para mí. – Dante
@Dante No está anulando 'SubscriptionToken', sino el método' Subscribe' (que es virtual). –
Lo siento, mi mal, estaba hablando del método 'Suscribir' que no es virtual, lo estoy buscando ahora mismo y si trato de compilar su ejemplo VS2010 me dice que el método no es' virtual'. De todos modos, tu solución es lo que estaba buscando, gracias – Dante