這篇是《Async and Await in C# and ASP.NET》的筆記,
文章中介紹async/await的觀念,非常精闢所以整理起來與大家分享
- .NET的非同步改善的不是速度、效能(performance);改善的是處理的資料量(throughput)。非同步的程式碼會明顯變快,是因為同時間處理的資料量變多,但使用非同步,程式的處理速度變快非必然!
- 使用非同步的注意事項
- 非同步不是多執行緒!多執行緒是使用兩個完全不同的thread,且這兩個thread不會有互動;但非同步可能是在同一個thread中,也有可能會跳出這個thread再跳回來。
- 使用非同步,在.NET底層會呼叫SynchronizationContext去標記某段程式碼有時間要來做。
- Threading is about owrkers; asynchrony is about tasks.
- Async Works on I/O Bound, Not CPU-Bound, Tasks
- 非同步優化的是「流程」!如果某個工作是需要CPU大量運算(例如:數學運算),或是要依賴前一個步驟的資料,那就是CPU-Bound,使用非同步的意義不大。
- 單純讀資料,像是從data base、service、REST API等等,這些就很適合用非同步,有空可以先去讀,節省時間。
- async這個詞會像病毒一樣擴散XD
- 基本上,一個函式改成非同步,幾乎所有和它相關的程式碼都要改。
- 要很清楚流程再用async,不同同步和非同步的程式碼混在一起很容易有問題。
- async程式碼常用的回傳值
- Task、Task<T>、void
- void很少用,因為會不知道該函式做完了沒;千萬不要用throw exception來做為有沒有做完的依據!
- 將同步程式碼改成非同步的建
- 由底往上改;從依賴最少的改起!
非常建議大家讀一下原文,
原文中有不少有趣的例子,
該篇的作者還有寫一篇後續,教大家怎麼將舊的(同步的)專案程式碼改成async/await,
大家也可以去讀讀看:
《A Practical Example Of Asynchronous Programming in C# and ASP.NET》
沒有留言:
張貼留言