Ich habe eine Sender
Klasse, die eine Message
auf ein IChannel
sendet:Wie warte ich darauf, dass ein C# -Ereignis ausgelöst wird?
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 Nachrichten senden, gibt der IChannel
manchmal eine Antwort je nachdem, welche Art von Message
durch Anheben des MessageReceived
Ereignis gesendet wurde. Die Ereignisargumente enthalten die Nachricht von Interesse.
Ich möchte Sender.Send()
Methode warten auf eine kurze Zeit, um zu sehen, ob dieses Ereignis ausgelöst wird. Wenn ja, werde ich seine MessageEventArgs.Message
Eigenschaft zurückgeben. Wenn nicht, gebe ich eine Null Message
zurück.
Wie kann ich auf diese Weise warten? Ich würde es vorziehen, nicht die threading Beinarbeit mit ManualResetEvents
und so zu tun, so auf normalen event
s haften wäre optimal für mich.
“. ..Preef nicht tun müssen, um die threading Beinarbeit zu tun ... "- Sollte dies interpretiert werden, wie Ihre App vollständig in einem einzigen Thread läuft? –
Nein, die Verwendung von Worker-Threads und so ist in Ordnung, und sie werden an anderer Stelle in der App verwendet (z. B. erzeugt die IChannel-Implementierung einen neuen Thread zum Schreiben in einen Stream). Ich möchte jedoch bei der syntaktischen Suggestion von Delegierten und Ereignissen bleiben und nicht die untergeordnete "System.Threading" verwenden. –
Delegaten und Ereignisse sind keine syntaktischen Zucker für Threading. Ereignisse werden ausgelöst und auf demselben Thread behandelt (es ist syntaktischer Zucker über einen Funktionsaufruf und funktioniert auf die gleiche Weise) –