Per quanto ne so, se tutti i sottoscrittori di eventi stanno utilizzando l'opzione ThreadOption.PublisherThread
(che è anche l'impostazione predefinita), l'evento viene eseguita in modo sincrono e gli abbonati possono modificare l'oggetto EventArgs
, così si potrebbe avere in casa editrice
myEventAggregator.GetEvent<MyEvent>().Publish(myParams)
if (myParams.MyProperty)
{
// Do something
}
il codice abbonato sarebbe simile a questa:
// 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;
}
Se si sa che l'evento dovrebbe sempre essere chiamato in modo sincrono, è possibile creare il proprio clas di base s per eventi (invece di CompositePresentationEvent<T>
) che sovrascrive il metodo Subscribe
e consente solo agli abbonati di utilizzare l'opzione ThreadOption.PublisherThread
. Sarebbe simile a questa:
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);
}
}
allora invece di derivare da MyEvent
CompositePresentationEvent
, si deriva da SynchronousEvent
, che garantirà che l'evento si chiamerà in modo sincrono e che si otterrà la modifica EventArgs
.
fonte
2012-06-28 23:24:35
Grazie per la risposta, ho capito il tuo punto, restituisco i dati tramite EventArgs e funziona. Per la cronaca, non ero in grado di creare la classe 'SyncronousEvent' poiché il metodo' SubscriptionToken' non è 'virtual'. Qualunque sia stata la tua domanda mi è stata di grande aiuto. – Dante
@Dante Non si esegue l'override di 'SubscriptionToken', ma il metodo' Subscribe' (che è virtuale). –
Scusa, peccato, stavo parlando del metodo "Subscribe" che non è virtuale, lo sto guardando proprio ora e se provo a compilare il tuo esempio VS2010 mi dice che il metodo non è 'virtual'. Ad ogni modo, la tua soluzione è quella che stavo cercando, grazie – Dante