我有一個Sender
類發送Message
上IChannel
:如何等待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
}
}
當我們發送信息,IChannel
有時會響應這取決於什麼樣的Message
是通過提高MessageReceived
事件發送。事件參數包含感興趣的消息。
我想Sender.Send()
方法來等待一小段時間,看看是否引發此事件。如果是這樣,我將返回其MessageEventArgs.Message
財產。如果不是,我會返回一個空值Message
。
我該如何等待這種方式?我寧願不要使用ManualResetEvents
等線程,因此堅持常規的event
對我來說是最合適的。
」。 ..不希望做線程legwork ...「 - 這應該解釋爲你的應用程序完全在一個線程內運行? – 2010-05-12 16:42:30
不,使用工作線程並且很好,它們在應用程序中的其他地方使用(例如,IChannel實現會產生一個新線程來寫入流)。儘管如此,我仍想繼續使用委託和事件的語法糖,而不是使用較低級別的System.Threading。 – 2010-05-12 16:44:19
代表和事件不是線程的語法糖。事件在同一線程中引發並處理(它是函數調用中的語法糖,其工作方式相同) – 2010-05-12 16:47:13