iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
自我挑戰組

學習C#續系列 第 23 篇

Day 23:非同步進階控制與取消機制

  • 分享至 

  • xImage
  •  

並行等待:Task.WhenAll:

  • 當有多個互不相依的非同步任務需要同時展開時,不要逐一使用 await,應同時啟動它們並使用 Task.WhenAll(...) 一起等待。
  • 非阻塞並行:所有任務會在背景同時執行,總等待時間取決於「耗時最久」的那一項,而非各任務時間的總和。
  • 回傳聚合結果:若傳入多個 Task,await Task.WhenAll(...) 會回傳一個陣列 T[],依序存放每個任務的執行結果。

取消機制:CancellationToken 與 CancellationTokenSource:

  • 協作式取消(Cooperative Cancellation):C# 的取消機制不是粗暴地強制終止執行緒,而是發布一個「取消請求」,由背景任務主動配合檢查並安全結束。
  • CancellationTokenSource(CTS):取消信號的發行端與控制器。由它產生權杖,並負責呼叫 cts.Cancel() 來觸發取消信號。
  • CancellationToken(CT):取消權杖,傳入被呼叫的非同步方法內部。
  • 檢查取消狀態:
    • token.ThrowIfCancellationRequested():若已收到取消請求,立即擲出 OperationCanceledException,中斷任務。
    • 將 token 直接傳給支援取消的底層非同步 API(例如 Task.Delay(1000, token) 或 HttpClient.GetAsync(url, token))。

逾時控制(Timeout Control):

  • 自動逾時設定:使用 new CancellationTokenSource(TimeSpan.FromSeconds(3)) 或呼叫 cts.CancelAfter(3000),時間一到會自動發出取消信號。
  • 例外捕捉:逾時或手動取消時,應捕捉 OperationCanceledException(或 TaskCanceledException)以進行後續資源清理與使用者提示。

實作練習
https://ithelp.ithome.com.tw/upload/images/20261006/20178925wb19bseOsS.png

https://ithelp.ithome.com.tw/upload/images/20261006/201789257FuKpJesM4.png

https://ithelp.ithome.com.tw/upload/images/20261006/20178925jr7NsA8PNa.png


上一篇
Day 22:非同步程式設計基礎(Async / Await)
下一篇
Day 24: 控制台 JSON 資料持久化
系列文
學習C#續 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言