tengo una clase que envía una Sender
Message
en un IChannel
:¿Cómo espero a que se produzca un evento de 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
}
}
Cuando enviamos mensajes, el IChannel
veces da una respuesta dependiendo de qué tipo de Message
fue enviado por provocar el evento MessageReceived
. Los argumentos del evento contienen el mensaje de interés.
Quiero que el método Sender.Send()
espere un tiempo breve para ver si se produce este evento. Si es así, devolveré su propiedad MessageEventArgs.Message
. Si no, devuelvo un nulo Message
.
¿Cómo puedo esperar de esta manera? Preferiría no tener que hacer el trabajo de subprocesamiento con ManualResetEvents
y tal, por lo que apegarse a los event
s normales sería óptimo para mí.
". ..preferir no tener que hacer el trabajo de subprocesos ... "- ¿Debería interpretarse esto como su aplicación se ejecuta completamente en un solo hilo? –
No, usar subprocesos de trabajo y eso está bien, y se usan en otra parte de la aplicación (por ejemplo, la implementación de IChannel genera un nuevo hilo para escribir en una secuencia). Sin embargo, quiero quedarme con el azúcar sintáctico de delegados y eventos, y no usar el 'System.Threading' de bajo nivel. –
delegados y eventos no son azúcar sintáctica para enhebrar. Los eventos se plantean y manejan en el mismo hilo (es azúcar sintáctica sobre una llamada a función y funciona de la misma manera) –