Wie kann ich warten, bis ein C# - Ereignis ausgelöst?

Ich habe eine Sender - Klasse, sendet eine Message auf eine 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
  }
}

Wenn wir Ihnen Nachrichten senden, die IChannel manchmal eine Antwort gibt, je nachdem, welche Art von Message gesendet wurde, durch die Erhöhung der MessageReceived Veranstaltung. Die event-Argumente enthalten, die die Nachricht von Interesse.

Möchte ich Sender.Send() Methode zu warten, für eine kurze Zeit zu sehen, wenn dieses Ereignis ausgelöst wird. Wenn dem so ist, werde ich zurück sein MessageEventArgs.Message Eigenschaft. Wenn nicht, ich eine null zurück Message.

Wie kann ich das warten auf diese Weise? Ich würde es vorziehen, nicht zu haben, tun Sie das threading-Beinarbeit mit ManualResetEvents und so, kleben regelmäßige events wäre optimal für mich.

  • "...lieber nicht zu tun haben, das threading-Arbeit..." - Soll das interpretiert werden, wie Sie Ihre app läuft vollständig in einem einzigen thread?
  • Nein, mit worker-threads und so ist fein, und Sie sind verwendet an anderer Stelle in der app (zum Beispiel IChannel-Umsetzung erzeugt einen neuen thread zum schreiben in einen stream). Ich möchte bleiben mit der syntaktischen Zucker von Delegaten und Ereignisse, obwohl, und nicht die lower-level -System.Threading.
  • Delegaten und Ereignisse sind nicht syntaktische Zucker für den Durchzug. Ereignisse werden ausgelöst und behandelt, die auf dem gleichen thread (es ist syntaktischer Zucker über einem Funktionsaufruf, und auf die gleiche Weise funktioniert)
  • Sorry, ich wollte nicht Ausdrücken, dass sehr gut. In Teil, was ich Frage, ist, ob ich das kann effektiv ein ManualResetEvent durch kleben mit events und delegates.
InformationsquelleAutor Evan Barkley | 2010-05-12
Schreibe einen Kommentar