Wie warte ich darauf, dass ein C # -Ereignis ausgelöst wird?

8

Ich habe eine Klasse Sender , die ein Message an ein IChannel sendet:

%Vor%

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.

    
Evan Barkley 12.05.2010, 16:37
quelle

5 Antworten

14

Verwende ein AutoResetEvent .

Gib mir ein paar Minuten und ich werde eine Probe zusammenstellen.

Hier ist es:

%Vor%     
Toby 12.05.2010, 16:44
quelle
1

Haben Sie versucht, die Funktion so zuzuweisen, dass sie asynchron zu einem Delegaten aufruft und dann den Befehl mydelegeintinstance.BeginInvoke aufruft?

Linky als Referenz.

Rufen Sie im folgenden Beispiel einfach

auf %Vor%

und es wird wie von Zauberhand funktionieren. :)

%Vor%     
Geoff 12.05.2010 16:43
quelle
0

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.

    
Will Marcouiller 12.05.2010 16:51
quelle
0

Nützliches Beispiel mit AutoResetEvent :

%Vor%     
Iuliia Ashomok 06.10.2014 09:25
quelle
-1

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%     
Ron Warholic 12.05.2010 17:34
quelle

Tags und Links