C# async/await 使用總結

今天搞這兩個關鍵字搞得有點暈,主要仍是沒有完全理解其中的原理。html

 

混淆了一個調用異步方法的概念:異步

在調用異步方法時,雖然方法返回一個 Task,可是其中的代碼已經開始執行。該方法在調用時,即刻執行了一部分代碼,直接最底層的 Async API 處才產生真正的異步操做,這時向上逐步返回,並最終使用一個 Task 來表明該異步任務。async

當不使用 await 關鍵字時,該異步方法一樣在異步執行。而使用 await 關鍵字後,只不過是對 Task(awaitable) 對象異步等待其執行結束,而後再同上下文中執行後續代碼。post

若是使用 await task.ConfigureAwait(false),表示該行後的代碼,都不須要必定在同一上下文中執行。線程

也就是說,對於 Task Run() 的調用來講:htm

1. RunAsync():直接執行該異步方法,後續代碼緊接着執行。對象

2. await RunAsync():執行異步方法,並在結束後再執行後續代碼(在此行代碼以前的代碼在同一線程中執行)。blog

3. await RunAsync().ConfigureAwait(false):執行異步方法,並在結束後再執行後續代碼(執行的線程不指定)。ip

 

Await 的使用get

另外,因爲 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

相關文章
相關標籤/搜索