2021年3月7日 星期日

讀《Async and Await in C# and ASP.NET》筆記 ─ .NET的非同步觀念

 這篇是《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



沒有留言:

張貼留言