Verwendet Async Worker-Thread aus dem Threadpool? [Duplikat]
Ich bin neu in der C # - und Async-Programmierung. Tut mir leid, wenn meine Frage dumm klingt. Angenommen, wir haben den folgenden Code:
static void Main()
{
SomeMethod();
Console.WriteLine("Main program almost finishes");
Console.ReadLine();
}
static async void SomeMethod()
{
await Task.Delay(4000);
Console.WriteLine("Asnc code finished");
}
Nach meinem Verständnis für die Anweisung await Task.Delay(4000);wird diese Arbeitseinheit in den Thread-Pool eingereiht, der von einem Worker-Thread ausgewählt wird, um sie auszuführen. Die Verzögerung tritt also im Worker-Thread auf (dieser Worker-Thread schläft 4 Sekunden), und sobald 4 Sekunden vergangen sind , ist dies der Fall Der Arbeitsthread führt weiterhin die folgende Anweisung aus: Ist Console.WriteLine("Asnc code finished");mein Verständnis korrekt?
Antworten
Wenn es um Asynchronität geht, gibt es einen sogenannten "Kontext". Normalerweise gibt es zwei Kontexte, den "UI" -Kontext und den "Hintergrund" -Kontext. Ersteres repräsentiert den Haupt- / UI-Thread und letzteres einen beliebigen Threadpool-Thread.
Ihr Beispiel sieht aus wie ein Konsolenprogramm, hat also keinen UI-Thread / Kontext.
awaitsetzt die Ausführung im selben Kontext fort, den Sie gerade verwenden. Dh wenn Sie sich im UI-Thread befinden, befindet sich alles, was nach dem Warten wartet, auch im Haupt-Thread. Wenn Sie sich nicht im UI-Thread befinden, setzen Sie die Ausführung in einem Threadpool-Thread fort (jedoch nicht unbedingt im selben Thread wie vor dem Warten).
Die Aufgabe, auf die Sie warten, verwendet möglicherweise einen Threadpool-Thread, den UI-Thread oder überhaupt keinen Thread. Das liegt ganz bei dem, der die Aufgabe erstellt hat.
Standardmäßig Task.Runwird ein Threadpool-Thread verwendet, es ist jedoch möglich, Aufgaben mit anderen Taskplanern zu starten, die ein anderes Verhalten aufweisen.