I have a Sender
class that sends a Message
on a IChannel
:
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
}
}
When we send messages, the IChannel
sometimes gives a response depending on what kind of Message
was sent by raising the MessageReceived
event. The event arguments contain the message of interest.
I want Sender.Send()
method to wait for a short time to see if this event is raised. If so, I'll return its MessageEventArgs.Message
property. If not, I return a null Message
.
How can I wait in this way? I'd prefer not to have do the threading legwork with ManualResetEvents
and such, so sticking to regular event
s would be optimal for me.