C# Wie synchrone Methode, die auf Ereignisse warten, um Feuer?
Habe ich benutzerdefinierte browser-Klasse, die in der Lage brennen eine Menge von Ereignissen je nach Seite gestöbert Zustand. Jetzt muss ich einige Operationen auf dieser web-Seite mit meinem browser, aber Sie haben zu laufen sequentialy, jeder Betrieb muss die Daten von der vorherigen.
Der sauberste Weg dies zu erreichen ist, um eine synchrone Methoden warten auf browser, um seine Arbeit zu tun. Ich machte es so:
public incomplete class MyClass {
//(...) lots of stuff comes here, it's a web browser :)
public bool MySyncMethod(object data) {
bool success = false;
bool wait = true;
MyEventHandler = new EventHandler((o, e) => {
data = MyEventProvidedData; //belive me, it's threre when it fired
success = true; //let's assume it always succeed
wait = false; //now we can move on to the rest of our long chain
});
//(...) here I have some more event handlers which can end my method...
MyAsyncMethod(data); //so it started and will fire MyEventHandler soon
while (wait) System.Threading.Thread.Sleep(100);
return success;
}
}
Aber irgendwas scheint hier falsch. Wenn ich threads, ich würde nur Platz myThread.Join() und nicht in meiner while-Schleife und es würde warten, bis mein thread abgeschlossen. Ist es etwas ähnlich-Thread.Join() kann verwendet werden, mit der Ereignisse ausgelöst durch die Kontrollen? Gibt es etwas zu verwenden, anstatt der while-Schleife? Ist es ein sauberer Weg, um mein Ziel erreichen? Der obige code funktioniert in der realen Anwendung, aber ich denke, es ist nicht optimal.
Und es gibt einen guten Grund, warum ich nicht verwenden threads hier - die gesamte Kommunikation zwischen threads und ActiveX-Steuerelement muss thread-sicher, und das ist nicht trivial zu erreichen. Ja, ich habe versucht 🙂 Dieser code war die Hölle, zu Debuggen, also beschloss ich Sie neu zu schreiben.
- unvollständige Klasse?
- Was ist
incomplete
Klasse ? - Haben Sie einen Blick auf die Beispiel-code zu Überwachen.Puls? Hier auf der MSDN-Website: msdn.microsoft.com/en-us/library/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, ManualResetEvent:
Wenn es möglich ist, verwenden Sie Aufgaben, die Sie nutzen könnten der WaitAll-Methode
Aber Sie sagen, Sie können nicht Fäden. Noch die asyncmethod beginnen müssen, eine Art threading, also muss es einige threading beteiligt?
Wenn das problem ist, dass die asyncmethod muss die post zurück an den ursprünglichen thread für die active-x-Steuerelement arbeiten, können Sie die ASyncOperationManager ( shameless eigenen blog-post link: http://blog.subrosoftware.nl/?p=42 ), oder die MSDN-link Könnte das vielleicht lösen die thread-callback-Problem?