我試圖抓住異步等待模式。繼this例如,我實現了 這個小程序:async等待錯誤的執行順序
private async void asynchWork()
{
// Line 1
Task<string> readTask = asynchAwaitWork();
// Line 2
synchWork();
// Line 3
string result = await readTask;
// Line 4
Debug.WriteLine(result);
Debug.WriteLine("The End");
}
private void synchWork()
{
for (int i = 0; i < 5; i++)
{
Debug.WriteLine("SynchWork For i : " + i);
Thread.Sleep(750);
}
}
private async Task<string> asynchAwaitWork()
{
for (int i = 0; i < 15; i++)
{
Debug.WriteLine("A-SynchWork For i : " + (i+111));
Thread.Sleep(750);
}
return "finished";
}
我預計,1號線執行,那麼2號線和4號線將不得不等待,直到3號線完成並返回一個字符串。 但看着輸出synchWork
方法在asynchWork
方法後執行。
A-SynchWork對於i:111
A-SynchWork對於i:112
A-SynchWork對於i:113
A-SynchWork對於i:114
A-SynchWork For I:115
...
A-SynchWork對於i:125
SynchWork對於i:0
SynchWork對於i:1個
SynchWork對於i:2
SynchWork對於i:3
SynchWork對於i:4
已完成
終結
我預期當asynchWork
方法是buisy並等待在第3行的結果被在時所執行的方法synchWork
。 這個例子中我誤解了什麼?還是僅僅是Debug.WriteLine
的輸出是按順序執行的,但是真正的工作順序是按照我的期望執行的?
編輯: 隨着意見和答案的幫助下,我瞭解到:
不要忽視警告,並研究它們的含義;使用
await
關鍵字允許等待)由該方法內部創建的
Task
執行的操作的結果。
編輯2:
- 但任務必須啓動!否則將不會有並行處理,編譯器將通過主線程追蹤它,而Line 3實際上只有Line 4的阻塞函數不多。
因爲Thread.Sleep(750)
只是一個模擬的工作,我並不真的需要Delay
這也適用:
private async Task<string> asynchAwaitWork()
{
await Task.Run(()=> {
for (int i = 0; i < 15; i++)
{
Debug.WriteLine("A-SynchWork For i : " + (i+111));
Thread.Sleep(750);
}
});
return "finished";
}
非常感謝你。我學到了很多:)
你應該得到'asynchAwaitWork'的編譯器警告,它給出了爲什麼它不起作用的線索 –
@ScottChamberlain等待丟失它說。因此它將被同步執行。我只是不太明白爲什麼從這個小小的信息。 –
@MongZhu然後對這個警告做一些研究。這裏有很多信息。 – Servy