現代 .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 + 註冊。