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>

結論

  • 避免
Made with Slides.com