In .Net 4.5 hat Microsoft die neue Async/Await
Funktion hinzugefügt , um die asynchrone Codierung zu vereinfachen. Ich frage mich jedoch
- Kann
Async/Await
die alte Art der Verwendung vollständig ersetzenThreads
? - Ist
Async/Await
in der Lage, alles zu tun, was einThread
asynchron tun kann? - Kann
Async/Await
nur mit einigen Methoden wie verwendet werdenWebClient.DownloadStringAsync
oder kann ich eine synchrone Methode konvertieren, um sie zu verwendenAsync/Await
und den Hauptthread nicht zu blockieren?
new Thread(() => {Some Work}).Start();
macht wie ?! ist es nicht?Antworten:
Nein. Ein Thread kann viele weitere nützliche Dinge tun. Await ist speziell zu behandeln entworfen etwas Zeit nehmen, am typischsten eine E / A - Anforderung. Dies wurde traditionell mit einem Rückruf durchgeführt, als die E / A-Anforderung abgeschlossen war. Das Schreiben von Code, der auf diesen Rückrufen beruht, ist ziemlich schwierig. Das Warten vereinfacht dies erheblich.
Grob. Await kümmert sich nur um die Verzögerung, sonst macht es nichts, was ein Thread macht. Der Ausdruck " Warten", der rechts neben dem Schlüsselwort "Warten" steht, erledigt die Aufgabe. Im Idealfall wird überhaupt kein Thread verwendet, es wird eine Treiberanforderung gesendet, und sobald der Treiber die Datenübertragung abgeschlossen hat, wird ein Rückruf für die Abschlussbenachrichtigung generiert. Netzwerke sind bei weitem die häufigste Verwendung, Latenzen von Hunderten von Millisekunden sind häufig und ein unvermeidlicher Nebeneffekt von Diensten, die vom Desktop oder LAN in die "Cloud" verlagert werden. Die synchrone Verwendung solcher Dienste würde dazu führen, dass eine Benutzeroberfläche nicht mehr reagiert.
Nein. Sie können es mit jeder Methode verwenden, die eine Aufgabe zurückgibt. Die XxxxAsync () -Methoden sind im .NET Framework nur vorgekochte Methoden für allgemeine Vorgänge, die Zeit benötigen. Wie das Herunterladen von Daten von einem Webserver.
quelle
async
ungeeignet sind.await Task.Run
für CPU-gebundene Arbeiten. Wenn ich das richtig verstehe, erreicht das manchmal das, was man sonst für einen Thread oder einen Hintergrundarbeiter tun würde.Die offizielle Erklärung dazu. Sie sollten jedoch die Unterschiede zwischen Threads und asynchroner Programmierung verstehen, bevor Sie blind eines durch andere ersetzen.
quelle
await Task.Run
. Es gibt eine kurze Erwähnung von Task.Run, aber es ist nicht klar. Fazit ist, dassawait
eine CPU-gebundene Aufgabe für sich genommen nicht parallel ausgeführt wird, daher sollten solche Arbeiten über ausgeführt werdenawait Task.Run
.Ich denke so darüber nach (und Microsoft auch, wenn Sie sich https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110 ansehen) ) #threads )
Async / await ist eine schnelle Möglichkeit, Code auf dem Hauptanwendungsthread auszuführen, mit dem Vorteil, dass sich der Code selbst aussetzen kann, wenn keine Arbeit zu erledigen ist, und den Fokus auf den Hauptthread zurückgibt und dort auf dem Hauptthread "aufwacht" ist ein Ergebnis, das erhalten werden muss, und leitet die Verarbeitung dann - Sie haben es erraten - an den Haupt-Thread zurück. Stellen Sie sich das wie eine ereignisbasierte GOTO-Anweisung in Basic vor, die die Steuerung an eine bestimmte Ausführungszeile weitergeben kann.
Im Gegensatz dazu ist ein Thread ein separater Ausführungsstrom, der mit eigenen Variablen usw. ausgeführt werden kann, wobei bei ausreichender Hardware die Ausführung parallel zum Hauptthread erfolgt.
Wenn Sie eine GUI-Anwendung haben, die eine einzelne Datei herunterladen und dann beim Herunterladen etwas mit dieser Datei tun wird, würde ich dies mithilfe einer asynchronen / wartenden Methode implementieren.
Wenn Ihre GUI jedoch 5000 Dateien herunterladen muss, würde ich einen Datei-Download-Thread erstellen, um dies zu handhaben, da der Haupt-GUI-Thread möglicherweise einfriert, während die Ausführung übertragen wird, um das Herunterladen der Dateien zu handhaben.
quelle