主要參考 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
屬性供外部存取。