Heim >Backend-Entwicklung >C++ >Await Task.Run vs. Await Async: Wann sollten Sie sich für welches entscheiden?
.NET asynchrone Programmierung: Auswahl der await Task.Run
- und await Async
-Methoden
Bei der asynchronen .NET-Programmierung ist die Verwendung der asynchronen Methoden await Task.Run
und await
oft verwirrend. Dieser Artikel wird den Unterschied zwischen den beiden anhand eines konkreten Szenarios veranschaulichen und ein umfassendes Verständnis vermitteln.
Szene:
Bedenken Sie die folgenden zwei Codeausschnitte:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
und
<code class="language-csharp">await LongProcess();</code>
wobei LongProcess
eine asynchrone Methode ist, einschließlich asynchroner Aufrufe wie await ExecuteReaderAsync()
.
Antwort:
In diesem speziellen Szenario gibt es keinen signifikanten Unterschied zwischen den beiden Methoden. Beide verwenden das Schlüsselwort await
, um die Kontrolle an den Aufrufer zurückzugeben, bevor der asynchrone Vorgang in LongProcess
abgeschlossen ist.
Die Natur der asynchronen Ausführung
Entgegen der landläufigen Meinung wird asynchroner Code nicht in mehreren Threads ausgeführt. Stattdessen wird es in einem Thread ausgeführt und nutzt dabei eine Technik namens „Kontextwechsel“.
Wenn eine asynchrone Funktion eine andere asynchrone Funktion aufruft, unterbricht der aktuelle Thread vorübergehend die Ausführung des Aufrufers und setzt die Ausführung des Aufgerufenen fort. Das Betriebssystem weist den angehaltenen Thread dann anderen verfügbaren Aufgaben zu.
Sobald jedoch eine await
-Anweisung beim Aufgerufenen gefunden wird, kehrt der aktuelle Thread zum Aufrufer zurück und setzt die Ausführung des Aufrufers effektiv fort.
Direktawait
Vorteile asynchroner Methoden
Da LongProcess
im gegebenen Szenario bereits eine asynchrone Methode ist, besteht keine Notwendigkeit, sie explizit in await
vor Task.Run
einzuschließen. Direkte await
asynchrone Methoden ermöglichen es Threads, sofort mit der Ausführung anderer Aufgaben zu beginnen, während sie auf den Abschluss von LongProcess
warten.
Task.Run
Nutzungsszenarien
Task.Run
hat seine spezifischen Anwendungsfälle, zum Beispiel:
Zusammenfassung
In dem angegebenen Szenario sind beide Methoden funktional gleichwertig. Der direkte await
asynchrone Ansatz ist jedoch vorzuziehen, da er den Thread-Wechsel reduziert und eine effizientere Nutzung des Thread-Pools ermöglicht.
Das obige ist der detaillierte Inhalt vonAwait Task.Run vs. Await Async: Wann sollten Sie sich für welches entscheiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!