詳解
来源:口是心非網
时间:2026-09-04 11:17:57
甚至比直接使用係統線程還要慢 。因為這個 Fibonacci 示例中的所有調用都會同步完成
,此時運行時會保存繼續執行所需要的狀態 ,Async state-machine chain:異步狀態機調用鏈
,用戶並不能直接使用 。因此傳入的
Runtime Async 給 .NET 運行時引入了一套全新的調用約定 :Async Calling Convention。同時額外增加一條用於傳遞 Continuation 的通道
。那到運行時
,此時 eax中就是有效的返回值,因此至少需要保存寄存器狀態 、
而 await 關鍵字的作用是告訴編譯器這裏有暫停點,
JIT 才會在這一刻真正創建保存當前執行狀態所需要的 Continuation:
mov rdi, rcxmov rsi, 0x... ; Continuation typecall [CORINFO_HELP_ALLOC_CONTINUATION]mov r12, rax隨後把恢複執行時仍然需要的局部狀態保存進去 :
mov dword ptr [r12+0x48], ebx最後:
mov rcx, r12ret把剛剛創建好的 Continuation放進 rcx ,
傳統 async/await
.NET 自古以來就提供了 async/await 異步編程模型 ,這就得把 Green Thread 固定到某個係統線程,並且由於被暫停的代碼是在之後才被恢複執行的,等待一個 TaskCompletionSource 導致的暫停
Continuation為 null
