iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
自我挑戰組

學習C#續系列 第 22 篇

Day 22:非同步程式設計基礎(Async / Await)

  • 分享至 

  • xImage
  •  

非同步(Asynchronous)的核心概念:

  • 非同步 不等於 多執行緒:多執行緒著重於多工運算(CPU-Bound),非同步主要著重於「釋放等待中的執行緒」(I/O-Bound,如檔案存取、網路請求、資料庫查詢)。
  • 不阻塞(Non-Blocking):在等待外部耗時作業(如下載檔案)時,目前執行緒不會停滯卡死,而是可以交回給系統處理其他工作;待作業完成後再回到中斷處繼續執行。

Task 與 Task:

  • 命名空間為 System.Threading.Tasks。
  • Task:代表一個正在進行或已排程的非同步操作,相當於傳統的 void(無回傳值)。
  • Task:代表一個有回傳值的非同步操作,完成時會產出型別為 T 的資料(例如 Task、Task)。

async 與 await 關鍵字:

  • async 修飾詞:標記該方法為非同步方法,允許在方法本體內使用 await。它會促使編譯器將該方法轉譯為狀態機(State Machine)。
  • await 運算子:只能在 async 方法內部使用。它的作用是「暫停目前非同步方法的執行,直到等待的 Task 完成」,但不會卡死作業系統執行緒。
  • 回傳型別慣例:非同步方法應回傳 Task 或 Task,避免使用 async void(除了最頂層的 UI 事件處理常式外,async void 會導致例外無法被外部 catch 攔截)。

在 Console 主程式中運作(async Task Main):

  • 從 C# 7.1 開始,主程式進入點原生支援非同步簽章:
  • static async Task Main(string[] args)。
  • 可以直接在 Main 方法內頂層呼叫 await,不再需要使用會阻塞執行緒的舊寫法(如 .Wait() 或 .Result,這些寫法容易引發 Deadlock 死結)。

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

https://ithelp.ithome.com.tw/upload/images/20261005/20178925DRpgE02vqh.png

https://ithelp.ithome.com.tw/upload/images/20261005/20178925wfUa1PIROu.png


上一篇
Day 21: 多執行緒基礎與執行緒安全(Thread & Concurrency)
系列文
學習C#續 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言