我有一个Sender发送一个类Message上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
}
}
Run Code Online (Sandbox Code Playgroud)
当我们发送消息时,IChannel有时会根据Message通过提升MessageReceived事件发送的类型给出响应.事件参数包含感兴趣的消息.
我希望Sender.Send()方法等待很短的时间来查看是否引发了此事件.如果是这样,我会归还其MessageEventArgs.Message财产.如果没有,我返回null Message.
我怎么能这样等?我宁愿不用这样做穿线腿部ManualResetEvents,所以坚持常规events对我来说是最理想的.
Tob*_*oby 15
用一个AutoResetEvent.
给我几分钟,然后我会把样品扔到一起.
这里是:
public class Sender
{
public static readonly TimeSpan MaxWait = TimeSpan.FromMilliseconds(5000);
private IChannel _c;
private AutoResetEvent _messageReceived;
public Sender()
{
// initialize _c
this._messageReceived = new AutoResetEvent(false);
this._c.MessageReceived += this.MessageReceived;
}
public Message Send(Message m)
{
this._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
// This will wait for up to 5000 ms, then throw an exception.
this._messageReceived.WaitOne(MaxWait);
return null;
}
public void MessageReceived(object sender, MessageEventArgs e)
{
//Do whatever you need to do with the message
this._messageReceived.Set();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18993 次 |
| 最近记录: |