我想了解異步/等待,並閱讀了大量的文章,但我仍然對同步/異步性質感到困惑。如果一個異步方法是單線程的,它如何在後臺運行?
我有以下的測試控制檯應用程序:
static void Main(string[] args)
{
var test = FooAsync();
Console.WriteLine("After FooAsync");
for (int i = 0; i < 100; i++)
Console.WriteLine("After that");
Console.ReadKey();
}
private static async Task FooAsync()
{
Console.WriteLine("Before delay");
await Task.Delay(1);
Console.WriteLine("After delay");
}
的代碼提供的線沿線的輸出:
Before delay
After FooAsync
After that
After that
After that
After that
After delay
After that
.
.
據我所知,異步/ AWAIT將不創建一個單獨的線程處理,並且在FooAsync
點達到await Task.Delay(1)
一行,它將返回到Main
,因爲任務尚未完成,但是,因爲我們只運行在一個單獨的讀有人可以解釋什麼觸發FooAsync
方法在Main
之內的某個任意點恢復,然後Main
可以繼續?
更新 我拿回來,i3arnon和dariogriffo是正確的。該代碼確實使用了多個線程(正如我之前看到的那樣,在調試器中查看或者按照kha的建議做了顯而易見的事情)。我被以下頁面的線程部分所困惑,https://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_Threads沒有意識到「延續」實際上指的是一旦任務「等待」完成就立即運行延續任務計劃。
的答案是正確的,但如果你想完全理解,這個替換您的FooAsync:'私有靜態異步任務FooAsync(){ Console.WriteLine(+ Thread.CurrentThread.ManagedThreadId「延遲之前」) ; await Task.Delay(1); Console.WriteLine(「After delay on」+ Thread.CurrentThread.ManagedThreadId);並且看到之前和之後都是在不同的線程上完成的。 – kha