Heim >Backend-Entwicklung >C++ >Await Task.Run vs. Await Async: Wann sollten Sie sich für welches entscheiden?

Await Task.Run vs. Await Async: Wann sollten Sie sich für welches entscheiden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-22 18:36:13750Durchsuche

Await Task.Run vs. Await Async: When Should You Choose Which?

.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.

DirektawaitVorteile 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.RunNutzungsszenarien

Task.Run hat seine spezifischen Anwendungsfälle, zum Beispiel:

  • Starten Sie eine neue Aufgabe, ohne darauf zu warten, und ermöglichen Sie so die nicht blockierende Ausführung zeitaufwändiger Vorgänge.
  • Führen Sie potenziell CPU-intensive Vorgänge in einem Hintergrundthread aus, wodurch der UI-Thread für eine reaktionsfähige Benutzerinteraktion frei wird.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn