Kann jemand erklären, was die await
Funktion tut?
c#
c#-5.0
async-await
Chris Nicol
quelle
quelle
Antworten:
Sie haben gestern bei PDC darüber gesprochen !
Await wird in Verbindung mit Tasks (parallele Programmierung) in .NET verwendet. Es ist ein Schlüsselwort, das in der nächsten Version von .NET eingeführt wird. Sie können damit mehr oder weniger die Ausführung einer Methode "anhalten", um darauf zu warten, dass die Task die Ausführung abschließt. Hier ist ein kurzes Beispiel:
quelle
Grundsätzlich sind die
async
undawait
erlauben Keywords , die Sie , dass die Ausführung eines Verfahrens angeben sollten auf allen Nutzungen stoppenawait
, die asynchrone Methodenaufrufe zu markieren, und dann wieder auf, sobald die asynchrone Operation abgeschlossen ist. Auf diese Weise können Sie eine Methode im Hauptthread einer App aufrufen und komplexe Arbeiten asynchron ausführen, ohne Threads und Verknüpfungen explizit definieren oder den Hauptthread der App blockieren zu müssen.yield return
Stellen Sie sich vor, es ähnelt einer Aussage in einer Methode, die eine IEnumerable erzeugt. Wenn die Laufzeit die erreichtyield
, wird im Grunde der aktuelle Status der Methode gespeichert und der Wert oder die Referenz zurückgegeben, die ausgegeben werden. Wenn IEnumerator.MoveNext () das nächste Mal für das Rückgabeobjekt aufgerufen wird (das intern von der Laufzeit generiert wird), wird der alte Status der Methode im Stapel wiederhergestellt und die Ausführung mit der nächsten Zeile nach dem fortgesetzt,yield return
als hätten wir das Objekt nie verlassen Methode. Ohne dieses Schlüsselwort muss ein IEnumerator-Typ benutzerdefiniert definiert werden, um den Status zu speichern und die Iterationsanforderungen zu verarbeiten. Die Methoden können in der Tat SEHR komplex werden.Ebenso muss eine als gekennzeichnete Methode
async
mindestens eine habenawait
. In einemawait
Fall speichert die Laufzeit den Status und den Aufrufstapel des aktuellen Threads, führt den asynchronen Aufruf durch und kehrt zur Nachrichtenschleife der Laufzeit zurück, um die nächste Nachricht zu verarbeiten und die App reaktionsfähig zu halten. Wenn der asynchrone Vorgang abgeschlossen ist, wird bei der nächsten Planungsmöglichkeit der Aufrufstapel zum Hochfahren des asynchronen Vorgangs zurückgeschoben und fortgesetzt, als ob der Anruf synchron wäre.Diese beiden neuen Schlüsselwörter vereinfachen die Codierung asynchroner Prozesse im Wesentlichen, ähnlich wie
yield return
die Generierung benutzerdefinierter Aufzählungen. Mit ein paar Schlüsselwörtern und ein wenig Hintergrundwissen können Sie alle verwirrenden und oft fehleranfälligen Details eines herkömmlichen asynchronen Musters überspringen. Dies ist in so ziemlich jeder ereignisgesteuerten GUI-App wie Winforms, WPF of Silverlight von unschätzbarem Wert.quelle
Die aktuell akzeptierte Antwort ist irreführend.
await
pausiert nichts. Erstens kann es nur in Methoden oder Lambdas verwendet werden, die alsasync
und als zurückgegeben markiert sind ,Task
odervoid
wenn es Ihnen egal ist, ob eineTask
Instanz in dieser Methode ausgeführt wird.Hier ist eine Illustration:
Ausgabe:
quelle
await
? Das heißt, wenn dies von einem UI-Thread aufgerufen wird, wird der UI-Thread für 3 Sekunden blockiert? Die Idee dieses Modells ist es, solche Dinge zu vermeiden.Für alle, die mit der asynchronen Programmierung in .NET noch nicht vertraut sind, ist hier eine (völlig falsche) Analogie in einem Szenario, mit dem Sie möglicherweise besser vertraut sind - AJAX-Aufrufe mit JavaScript / jQuery. Ein einfacher jQuery AJAX-Beitrag sieht folgendermaßen aus:
Der Grund, warum wir die Ergebnisse in einer Rückruffunktion verarbeiten, ist, dass wir den aktuellen Thread nicht blockieren, während wir auf die Rückkehr des AJAX-Aufrufs warten. Erst wenn die Antwort fertig ist, wird der Rückruf ausgelöst und der aktuelle Thread kann in der Zwischenzeit andere Aufgaben ausführen.
Wenn JavaScript das
await
Schlüsselwort unterstützt (was es natürlich ( noch! ) Nicht tut ), können Sie dasselbe damit erreichen:Das ist viel sauberer, aber es sieht so aus, als hätten wir synchronen, blockierenden Code eingeführt. Aber der (gefälschte) JavaScript-Compiler hätte alles danach genommen
await
und in einen Rückruf verkabelt, sodass sich das zweite Beispiel zur Laufzeit genauso verhält wie das erste.Es kann nicht scheinen , wie es Ihnen viel Arbeit zu speichern, aber wenn es um Dinge wie die Ausnahmebehandlung und Synchronisation Kontexten kommt, wird der Compiler tatsächlich eine tun viel schweres Heben für Sie. Für mehr würde ich die FAQs empfehlen, gefolgt von Stephen Clearys Blogserie .
quelle
Wenn ich es in Java implementieren müsste, würde es ungefähr so aussehen:
Ihre Anwendung würde es folgendermaßen verwenden:
quelle