web-dev-qa-db-de.com

Führt die Verwendung von async/await zu einem neuen Thread?

Ich bin neu bei TPL und frage mich: Wie bezieht sich die in C # 5.0 neue asynchrone Programmierung (über die neuen Schlüsselwörter async und await) auf die Erstellung von Threads?

Erzeugt die Verwendung von async/await bei jeder Verwendung einen neuen Thread? Und wenn es viele verschachtelte Methoden gibt, die async/await verwenden, wird für jede dieser Methoden ein neuer Thread erstellt?

35
dev hedgehog

Kurz gesagt NEIN

Von Asynchrones Programmieren mit Async und Await: Threads

Die Schlüsselwörter async und waiting erwarten nicht, dass zusätzliche Threads .__ sind. erstellt. Async-Methoden erfordern kein Multithreading, da ein asynchroner Methode läuft nicht in einem eigenen Thread. Die Methode wird auf dem aktuellen .__ ausgeführt. Synchronisationskontext und verwendet Zeit nur für den Thread, wenn die Methode ist aktiv. Sie können Task.Run verwenden, um CPU-gebundene Arbeit in eine .__ zu verschieben. Hintergrundthread, aber ein Hintergrundthread hilft nicht bei einem Prozess Das wartet nur darauf, dass Ergebnisse verfügbar werden.

40
Adriaan Stander

Ich habe also das Threading-Modell gelesen und Async/Await kann sicherlich dazu führen, dass neue Threads verwendet werden (nicht unbedingt erstellt - der Pool erstellt sie beim Start der Anwendung). Der Scheduler muss entscheiden, ob ein neuer Thread benötigt wird. Und wie ich es sehe, kann ein Aufruf an eine erwartbare Funktion interne Details haben, die die Wahrscheinlichkeit erhöhen, dass der Scheduler einen anderen Thread verwendet. einfach weil mehr Arbeit mehr Möglichkeiten/Gründe für den Scheduler bedeutet, um die Arbeit zu verteilen.

WinRT-Asynchronvorgänge werden automatisch im Thread-Pool ausgeführt. Normalerweise rufen Sie FROM aus dem Thread-Pool auf, mit Ausnahme der UI-Thread-Arbeit. Xaml/Input/Events.

Bei asynchronen Vorgängen, die für Xaml/UI-Threads gestartet wurden, werden die Ergebnisse an den [aufrufenden] UI-Thread zurückgegeben. Ergebnisse eines asynchronen Vorgangs, die von einem Thread-Pool-Thread gestartet werden, werden jedoch überall dort bereitgestellt, wo die Fertigstellung stattfindet. Dies ist möglicherweise nicht derselbe Thread, mit dem Sie sich zuvor befanden. Der Grund dafür ist, dass Code, der für den Thread-Pool geschrieben wurde, wahrscheinlich so geschrieben wurde, dass er Thread-sicher ist, und dass es auch aus Gründen der Effizienz erforderlich ist, dass Windows diesen Threadwechsel nicht aushandeln muss.

Als Antwort auf das OP werden also nicht unbedingt neue Threads erstellt, aber Ihre Anwendung kann und wird mehrere Threads verwenden, um die asynchrone Arbeit abzuschließen.

Ich weiß, dass dies einigen der Literatur in Bezug auf async/await zu widersprechen scheint, aber das liegt daran, dass das async/await-Konstrukt an sich nicht multithreaded ist. Awaitables sind der oder einer der Mechanismen, mit denen der Scheduler die Arbeit teilen und Aufrufe über Threads erstellen kann.

Dies ist an der Grenze meines Wissens, was Async und Threading betrifft, daher habe ich es vielleicht nicht genau richtig, aber ich denke, es ist wichtig, die Beziehung zwischen awaitables und Threading zu sehen.

0
Gavin Williams