C# async/await 使用總結

BloodyAngel發表於2015-05-12

今天搞這兩個關鍵字搞得有點暈,主要還是沒有徹底理解其中的原理。

 

混淆了一個呼叫非同步方法的概念:

在呼叫非同步方法時,雖然方法返回一個 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實現並行

有關async/await的實現背後

在MVC中使用async和await的說明

async & await 的前世今生(Updated)

C# 5.0 Async Tips and Tricks, Part 1

Async and Await

 

相關文章