C#中的異步陷阱

jopen 11年前發布 | 10K 次閱讀 C#

  有時候,理解一種語言中的缺陷的最好方式是查看另一種語言如何防止這些缺陷發生。《Real-World Functional Programming》(注:該書已由清華大學出版社引進,中文名《C#與F#編程實踐》)的作者 Tomas Petricek 討論了異步 C# 代碼中常見的 7 項錯誤,并說明F#如何降低這些缺陷出現的可能性。

  以下是 Tomas 的文章《在 C# 和F#中使用異步:C#中的異步陷阱》所覆蓋內容的簡要介紹,而我們更鼓勵讀者閱讀整篇文章。

  Async沒有異步運行:只有在第一個 await 語句之后出現的代碼才會異步運行。

  忽略結果:忘記 await 一個函數返回的任務,將會導致亂序執行。

  Async void方法:不能 await 一個返回“async void”而不是“async Task”的異步函數,這會導致與上一條相同的問題。

  Async void lambda函數:發生在當某個函數接收一個 Action 委托而不是 Func<…,Task>委托的時候。此外也無法 await 一個 async 函數。

  嵌套任務:在語句“await Task.Factory.StartNew (async () => { await Task.Delay (1000); });”中,第一個和第二個 await 語句互相之間完全無關。這意味著第一個 await 將在第二個 await 之前完成,而語句中關聯的 1000ms 延遲將被忽略。

  未按異步方式運行:使用 Task.Wait ()會將整個調用棧強制轉為同步模式。

  對那些不熟悉F#的開發者來說,在了解到F#中的 async 工作流并不是基于 Task 和 Task<T>類型的時候或許會感到驚訝。相反,F#使用自己的類型——Async<T>。

來自: InfoQ
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!