Warten auf Ereignis behandelt werden
Habe ich eine Funktion, nennen wir es Func1 und it contains
Func2 & event-handler.
Was ich jetzt erreichen möchte ist not let
Funktion (Func1) return-Wert bis Func2 Brände und Griffen Fall.
Grundsätzlich Func1 hat string als return-Wert und string-Wert festgelegt ist, innerhalb von event-handler. Also muss ich warten, bis das Ereignis verarbeitet und dann wieder Wert.
Code-Beispiel
public static string Fun1 ()
{
string stringToReturn = String.Empty;
Func2(); //Func2 will after few sec fire event bellow
example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
{
stringToReturn = "example"; //this wont be hardcoded
};
//wait for event to be handled and then return value
return stringToReturn;
}
- Tut Func2 ausgeführt auf einem anderen thread als Func1?
- nope, es läuft auf den gleichen thread
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie die
AutoResetEvent
Klasse. Instanziieren es mitvar evt = new AutoResetEvent(false);
rufenevt.WaitOne()
wo Sie wollen, zu warten, undevt.Set();
wo Sie wollen, um zu signalisieren, dass das warten code gehen kann.Wenn Sie viele "warten" Situationen, Ereignisse beinhalten, Sie konnte auch einen Blick in Reactive Extensions (Rx).
evt.WaitOne()
undevt.Set()
? Sind Sie sicher, dass Sie rufen Sie beide Methoden auf die gleiche Instanz vonAutoResetEvent
(dies ist entscheidend)?Wäre nicht eine einfache semaphore ausreichen?
Als
Func2
läuft im selben thread wieFunc1
,Func1
wird nicht zurückkehren, bevorFunc2
gibt. Dies bedeutet, es ist gewährleistet, dass das Ereignis ausgelöst inFunc2
wird immer ausgelöst, bevor es wiederFunc1
. Verbinden Sie einfach Ihr event handler vor dem AufrufFunc2
und es sollte funktionieren wie erwartet.Mit einem
Semaphore
oder eineAutoResetEvent
ist übertrieben in diesem Szenario als die beiden erwerben OS-Ressourcen zu verwalten, die thread-Synchronisation.