C# 開發實戰
非同步程式開發技巧
2019 will保哥課程課後分享
基本核心知識
-
什麼是非同步
-
解決什麼問題
什麼是非同步設計
- 一種並行處理
- I'll Call You Back
- 不一定要通過執行緒才能做到非同步
- CPU bound / IO bound
- 以餐廳為例
- CPU, 多核心
- 程式 (Program), 處理程序 (Process),
- 執行 (Execute), 執行緒 (Thread)
- 內容交換 (Context Switching)
- 執行緒安全(Thread-safe)
- 死結 (Deadlock)
- TAP (Task-based Asynchronous Pattern)
以工作為基礎的非同步模式
常見使用非同步情境
- I/O
- Parallelism
- Dashboard 各元件
- Long-running event-driven
- WebSocket / SignalR / Stream
每次處理超過 50ms 即可考慮
實際專案使用非同步
- Window Forms
- WPF
- ASP.NET
- HttpRequest 請求 (應付請求與外部資源)
TAP
以工作為基礎的非同步模式
Task-based Asynchronous Pattern
特色
- async / await
- Task Status 屬性
- IsCanceled
- IsCompleted
- IsFaulted
- 提供程式設計控制能力與除錯
Task 9 種使用情境
- 產生 (Creation) / 啟動 (Start) / 傳入參數 (Parameter)
- 等候結束 (Wait)
- 繼續 (Continuation)
- 傳回值 (Return)
- 取消 (Cancellation)
- 進度 (Progress)
- 異常與除錯 (Exception)
產生 (Creation) / 啟動 (Start) / 傳入參數 (Parameter)
Task.Run(() => Method(parameters))
其他工作情況參考範例
看 Demo
非同步設計最佳實務
操作 | 避免 | 替換方法 |
---|---|---|
檢索背景工作結果 | Task.Wait or Task.Result |
await |
等待任何工作完成 | Task.WaitAny | await Task.WhenAny |
檢索多個工作結果 | Task.WaitAll | await Task.WhenAll |
等待一段時間 | Thread.Sleep | await Task.Delay |
常見解決方法
- Task.Run 或 TaskFactory.StartNew
- TaskFactory.FromAsync
TaskCompletionSource<T> - CancellationTokenSource
CancellationToken - IProgress<T> 和 Progress<T>
結論
- 避免
C# 開發實戰非同步程式開發技巧
By Sean Chen
C# 開發實戰非同步程式開發技巧
- 1,017