介紹
非同步程式設計模式(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 使用 Begin 和 End 方法
- EAP須有一或多個方法、事件處理常式委派類型,以及 EventArg 衍生類型
為什麼要有以TAP為基礎的
解決以往用執行緒與其他設計模式所存在的缺點與問題
- 容易使用、完成,封鎖,除錯、測試、取消、例外異常、回報進度、同步處理
- 讓非同步程式碼寫起來更輕鬆、可讀性佳和更好維護
關於async/await詳細介紹以及死結造成原因之後會專門寫一篇文章跟大家講解
參考資料
我的鐵人賽文章