今天搞這兩個關鍵字搞得有點暈,主要還是沒有徹底理解其中的原理。
混淆了乙個呼叫非同步方法的概念:
在呼叫非同步方法時,雖然方法返回乙個 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
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...