iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Software Development

玩轉C# 進階學習之旅系列 第 21

玩轉C#之【非同步程式設】

  • 分享至 

  • xImage
  •  

介紹

非同步程式設計模式(Asynchronous Programming Patterns)

  • APM 非同步程式設計模型
  • EAP 事件架構非同步模式
  • TAP 以工作為基礎的非同步模式

先在主要以TAP

以TASK 為基礎的非同步模式

Parallel programming architecture in .NET

非同步開發在TAP出現前有不低的進入門檻

  • 僅有 Thread、APM、EAP 技術可以選擇
  • 無法使用同步設計邏輯來進行設計,不好維護
  • 遇到 Callback 內又有 Callback 的情境 (Callback Hell)
  • 需要將程式碼從一個同步內容封裝到另一個同步內容
  • 面對例外異常將會不好處理
  • 對於取得非同步執行結果需要額外進行處理

以TASK為基礎的非同步模式

  • 使用單一方法表示非同步作業的啟始
    • APM 要有 Begin /執行、EAP 要有啟動方法完成事件
  • 也可以使用類似 Callback 的委派事件
  • 該模式要求用具有 Async 後綴命名方法
  • 配合 C# 5.0 的 async / await 關鍵字,可以用同步程式思維模式設計出非同步的程式碼
  • 支援取消、進度、狀態、異常例外處理

什麼是「工作」(Task)

  • Task 類別的代表單一作業不會傳回值,而此通常以非同步方式執行
  • 但也會有例外,例如:該工作一執行,立即就結束了
    • Task類別代表有 TResult 型別的回傳值
  • 表示有某些事情需要些時間完成
    • 計算機科學術語,代表 未來future 與承諾promise
    • 所謂未來承諾,指的是將來一定會完成指定的作業
  • 因為所執行的工作 Task 物件通常是從執行緒集區執行緒上取得執行緒來以非同步方式執行,而不是以同步方式在主應用程式執行緒中,您可以使用 Status 屬性,或者IsCanceled、IsCompleted 及 IsFaulted 屬性,以判斷工作的現在執行結果狀態。
  • 在某些方面,工作類似執行緒ThreadPool 工作項目,但為等級較高 抽象 封裝
    • 執行緒表示作業系統要處理工作的基本單元
  • 比使用執行緒提供更多的程式設計控制能力與容易除錯
  • 你可以想像 Task 就是一張工單 (Worksheet)
    • 你可以開好工單之後,等待工作完成,同時還可以刷一刷抖音(TikTok)
    • 當工作完成時,會有人主動告訴你結果,或是通知你工作已完成
  • 使用 單一方法 表示非同步作業啟始完成
    • 其他模式比較
  • APM 使用 BeginEnd 方法
  • EAP須有一或多個方法、事件處理常式委派類型,以及 EventArg 衍生類型

為什麼要有以TAP為基礎的

解決以往用執行緒與其他設計模式所存在的缺點與問題

  • 容易使用、完成,封鎖,除錯、測試、取消、例外異常、回報進度、同步處理
  • 讓非同步程式碼寫起來更輕鬆、可讀性佳和更好維護

關於async/await詳細介紹以及死結造成原因之後會專門寫一篇文章跟大家講解

參考資料

C# 開發實戰:非同步程式開發技巧

本篇已同步發表至個人部落格
https://moushih.com/2022ithome21/


上一篇
玩轉C#之【執行序-執行緒安全】
下一篇
玩轉C#之【SOLID】
系列文
玩轉C# 進階學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言