J'ai une classe Sender
qui envoie un Message
sur un IChannel
:Comment puis-je attendre qu'un événement C# soit déclenché?
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
}
}
Lorsque nous envoyons des messages, le IChannel
donne parfois une réponse en fonction de ce type de Message
a été envoyé par l'événement est MessageReceived
. Les arguments d'événement contiennent le message d'intérêt.
Je souhaite que la méthode Sender.Send()
attende un court instant pour voir si cet événement est déclenché. Si c'est le cas, je vais retourner sa propriété MessageEventArgs.Message
. Sinon, je renvoie un Message
nul.
Comment puis-je attendre de cette façon? Je préférerais ne pas avoir faire le filetage avec ManualResetEvents
et ainsi de suite, donc coller à event
s serait optimal pour moi.
». .. préférez ne pas avoir à faire le threading legwork ... "- Cela devrait-il être interprété comme votre application fonctionne entièrement dans un seul thread? –
Non, l'utilisation de threads de travail et autres est bonne, et ils sont utilisés ailleurs dans l'application (par exemple, l'implémentation IChannel génère un nouveau thread pour écrire dans un flux). Je veux rester avec le sucre syntaxique des délégués et des événements, cependant, et ne pas utiliser le 'System.Threading' de niveau inférieur. –
Les délégués et les événements ne sont pas du sucre syntaxique pour le threading. Les événements sont levés et traités sur le même thread (c'est du sucre syntaxique sur un appel de fonction et fonctionne de la même manière) –