我如何等待C#事件被提升?

Eva*_*ley 9 c# events

我有一个Sender发送一个类MessageIChannel:

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)