C async await 使用總結

2021-09-09 04:43:41 字數 1073 閱讀 6025

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

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

在呼叫非同步方法時,雖然方法返回乙個 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();//再執行其它操作。

參考:

dudu:實際案例:在現有**中通過async/await實現並行

有關async/await的實現背後

在mvc中使用async和await的說明

async & await 的前世今生(updated)

c# 5.0 async tips and tricks, part 1

async and await

C async await 使用總結

今天搞這兩個關鍵字搞得有點暈,主要還是沒有徹底理解其中的原理。混淆了乙個呼叫非同步方法的概念 在呼叫非同步方法時,雖然方法返回乙個 task,但是其中的 已經開始執行。該方法在呼叫時,即刻執行了一部分 直接最底層的 async api 處才產生真正的非同步操作,這時向上逐步返回,並最終使用乙個 ta...

C async await 使用總結

今天搞這兩個關鍵字搞得有點暈,主要還是沒有徹底理解其中的原理。混淆了乙個呼叫非同步方法的概念 在呼叫非同步方法時,雖然方法返回乙個 task,但是其中的 已經開始執行。該方法在呼叫時,即刻執行了一部分 直接最底層的 async api 處才產生真正的非同步操作,這時向上逐步返回,並最終使用乙個 ta...

EJunGrid使用總結

1 1。0版沒有實現垂直方向上的對齊,procedure tobgui reportdesign.griddrawcelltext acanvas tcanvas const arect trect const acoord tpoint agrid tzjgrid const text strin...