iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0

Task 內部架構

主要參考 runtime 專案中的 System/Threading/Tasks/Task.cs 檔案。

執行流程:

初始狀態:已建立/等待啟動
 → 呼叫 Start() 或進行排程 → 進入「等待執行」狀態
  → 由執行緒池執行 ExecuteEntry → 進入「執行中」狀態(委派方法已呼叫)
   → 執行使用者委派:可能成功、發生例外或拋出取消例外
    → 標記為「使用者委派已執行完成」
     → 若包含子任務:進入「等待子任務完成」狀態 → 直到最後一個子任務完成
     → 進入第二階段完成程序:設定最終狀態為「執行完成」、「發生錯誤」或「已取消」
     → 進入第三階段完成程序:清理資源、通知父任務、執行接續動作
      → 觸發 Await、ContinueWith、WhenAll 等後續操作

重要欄位說明:

  • m_stateFlags:以位元標記記錄多種狀態(如是否完成、發生錯誤、已取消、等待計數等)
  • m_action / m_stateObject:儲存要執行的委派方法及其參數狀態
  • m_continuationObject:可能是單一委派、委派清單或特殊標記物件
  • m_taskScheduler:任務排程器參考(通常預設為執行緒池排程器)
  • m_parent / m_contingentProperties:記錄父子任務關係、取消信號、例外集合等擴充屬性
  • 泛型任務中的 m_result:儲存執行結果

典型生命週期: 已建立 → (排程) → 執行中 → (設定結果/例外/取消) → 完成狀態
完成階段會依序呼叫 FinishStageTwo()FinishContinuations(),遍歷並執行所有接續任務。

TaskCompletionSource:提供外部控制任務狀態的封裝機制(透過 TrySetResult/Exception/Canceled 方法)。內部包含一個 Task 執行個體,並公開對應的 Task 屬性供外部存取。


上一篇
Task/ValueTask 與非同步排程器原始碼導讀
下一篇
任務狀態流轉與延續
系列文
新 .NET & Azure & IoT & AI 開源技術實戰手冊 (含深入官方程式碼講解) 22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言