今天搞這兩個關鍵字搞得有點暈,主要還是沒有徹底了解其中的原理。
混淆了一個調用異步方法的概念:
在調用異步方法時,雖然方法傳回一個 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 相關的文章
<a href="http://www.cnblogs.com/dudu/p/async_await_parallel.html">dudu:實際案例:在現有代碼中通過async/await實作并行</a>
<a href="http://wei.si/blog/2012/11/behind-async-await-keywords">有關async/await的實作背後</a>
<a href="http://www.cnblogs.com/yeagen/archive/2013/09/22/3334059.html">在mvc中使用async和await的說明</a>
<a href="http://www.cnblogs.com/jesse2013/p/async-and-await.html">async & await 的前世今生(updated)</a>
<a href="http://jaylee.org/post/2012/06/18/csharp-5-0-async-tips-and-tricks-part-1.aspx">c# 5.0 async tips and tricks, part 1</a>
<a href="http://blog.stephencleary.com/2012/02/async-and-await.html">async and await</a>