今天搞這兩個關鍵字搞得有點暈,主要還是沒有徹底理解其中的原理。
混淆了一個調用異步方法的概念:
在調用異步方法時,雖然方法返回一個 Task,但是其中的代碼已經開始執行。該方法在調用時,即刻執行了一部分代碼,直接最底層的 Async API 處才產生真正的異步操作,這時向上逐步返回,並最終使用一個 Task 來代表該異步任務。
當不使用 await 關鍵字時,該異步方法同樣在異步執行。而使用 await 關鍵字后,只不過是對 Task(awaitable) 對象異步等待其執行結束,然后再同上下文中執行后續代碼。
如果使用 await task.ConfigureAwait(false),表示該行后的代碼,都不需要一定在同一上下文中執行。
也就是說,對於 Task Run() 的調用來說:
1. RunAsync():直接執行該異步方法,后續代碼緊接着執行。
2. await RunAsync():執行異步方法,並在結束后再執行后續代碼(在此行代碼之前的代碼在同一線程中執行)。
3. await RunAsync().ConfigureAwait(false):執行異步方法,並在結束后再執行后續代碼(執行的線程不指定)。
Await 的使用
另外,由於 await 只針對 awaitable 對象,所以並不要求一定要在異步方法之前使用。可以在適當的時候再使用 await,例如:
var task = RunAsync();//開始執行異步操作。
DoSth();//同時主線程執行其它操作。
await task;//此時等待異步執行完成。
DoOtherThing();//再執行其它操作。
參考:
下面,列出幾篇 async await 相關的文章
dudu:實際案例:在現有代碼中通過async/await實現並行
C# 5.0 Async Tips and Tricks, Part 1