現代 .NET 的非同步模型(async/await + Task Parallel Library, TPL)是 I/O 服務、雲端 API、IoT 邊緣裝置與高效能服務的核心。理解 Task / ValueTask 與排程器(TaskScheduler / ThreadPool)內部實作,有助:
Task 優化為 ValueTask
本文提供心智模型 → 原始碼對照 → 實驗 → 效能與陷阱。建議先通讀,再帶著具體問題進入 runtime 原始碼。
核心構件:Task(結果容器 + 延續列表)、TaskScheduler(排程策略)、ThreadPool(執行工作者)、ExecutionContext(流程上下文)、SynchronizationContext(邏輯同步環境)、ValueTask(高命中同步結果的分配優化封裝)、IValueTaskSource(進階可重用狀態源)。
語法糖展開(以 async Task<int> Foo() 為例):
IAsyncStateMachine,包含欄位:int <>1__state、AsyncTaskMethodBuilder<int> <>t__builder、暫存區(locals / awaiter)MoveNext()。await expr:
expr.GetAwaiter() → 檢查 IsCompleted
awaiter.OnCompleted(stateMachineBoxed.MoveNext);方法先 return(尚未完成的 Task)awaiter.GetResult() 繼續下一段builder.SetResult(value) 或例外路徑 builder.SetException(ex)。對照原始碼(System.Runtime.CompilerServices):
AsyncTaskMethodBuilder / AsyncTaskMethodBuilder<T>
AsyncValueTaskMethodBuilder / <T>
TaskAwaiter / ConfiguredTaskAwaitable
關鍵方法 AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted → 包裝 continuation + 註冊。