Ich habe eine Klasse Sender
, die ein Message
an ein IChannel
sendet:
Wenn wir Nachrichten senden, gibt IChannel
manchmal eine Antwort, abhängig davon, welche Art von Message
gesendet wurde, indem das Ereignis MessageReceived
ausgelöst wird. Die Ereignisargumente enthalten die Nachricht von Interesse.
Ich möchte, dass die Methode Sender.Send()
kurz wartet, um zu sehen, ob dieses Ereignis ausgelöst wird. Wenn das der Fall ist, gebe ich die Eigenschaft MessageEventArgs.Message
zurück. Wenn nicht, gebe ich eine Null Message
zurück.
Wie kann ich auf diese Weise warten? Ich würde es vorziehen, die Threading-Arbeit nicht mit ManualResetEvents
und so weiter zu machen, also wäre es normal für mich, bei event
s zu bleiben.
Vielleicht sollte Ihre MessageReceived-Methode einfach einen Wert für eine Eigenschaft Ihrer IChannel-Schnittstelle kennzeichnen, während Sie den INotifyPropertyChanged-Ereignishandler implementieren, damit Sie benachrichtigt werden, wenn die Eigenschaft geändert wird.
Dadurch könnte Ihre Sender-Klasse eine Schleife durchlaufen, bis die maximale Wartezeit abgelaufen ist oder wenn der PropertyChanged-Ereignishandler auftritt und die Schleife erfolgreich unterbrochen wird. Wenn Ihre Schleife nicht unterbrochen wird, gilt die Nachricht als nie erhalten.
WaitOne
ist wirklich das richtige Werkzeug für diesen Job. Kurz gesagt, Sie möchten zwischen 0 und MaxWaitInMs
Millisekunden warten, bis ein Job abgeschlossen ist. Sie haben wirklich zwei Möglichkeiten, um nach Abschluss zu suchen oder die Threads mit einem Konstrukt zu synchronisieren, das beliebig lange warten kann.
Da Sie sich über den richtigen Weg bewusst sind, werde ich für die Nachwelt die Umfrageversion veröffentlichen:
%Vor%