Ho una classe Sender
che invia una Message
su un IChannel
:Come posso aspettare che venga sollevato un evento C#?
public class MessageEventArgs : EventArgs {
public Message Message { get; private set; }
public MessageEventArgs(Message m) { Message = m; }
}
public interface IChannel {
public event EventHandler<MessageEventArgs> MessageReceived;
void Send(Message m);
}
public class Sender {
public const int MaxWaitInMs = 5000;
private IChannel _c = ...;
public Message Send(Message m) {
_c.Send(m);
// wait for MaxWaitInMs to get an event from _c.MessageReceived
// return the message or null if no message was received in response
}
}
Quando inviamo messaggi, il IChannel
a volte dà una risposta a seconda del tipo di Message
è stato inviato aumentando l'evento MessageReceived
. Gli argomenti dell'evento contengono il messaggio di interesse.
voglio Sender.Send()
metodo di aspettare per un breve periodo di tempo per vedere se questo evento viene generato. In tal caso, restituirò la proprietà MessageEventArgs.Message
. In caso contrario, restituisco un valore nullo Message
.
Come posso aspettare in questo modo? Preferirei non avere il legwork di threading con ManualResetEvents
e così, quindi attenersi al normale event
s sarebbe ottimale per me.
". ..prefer non devi fare il legwork di threading ... "- Questo dovrebbe essere interpretato come la tua app viene eseguita interamente all'interno di un singolo thread? –
No, l'utilizzo di thread di lavoro e simili va bene, e vengono utilizzati altrove nell'app (ad esempio, l'implementazione di IChannel genera un nuovo thread per scrivere in un flusso). Tuttavia, voglio rimanere con lo zucchero sintattico dei delegati e degli eventi e non utilizzare il 'System.Threading 'di livello inferiore. –
i delegati e gli eventi non sono zucchero sintattico per il threading. Gli eventi vengono generati e gestiti sullo stesso thread (è lo zucchero sintattico durante una chiamata di funzione e funziona allo stesso modo) –