(result, continuation) = B(continuation, args);這裏的 continuation 用來表示整個異步調用鏈在發生暫停後繼續執行所需要的狀態 。當異步操作完成時,掛起與恢複等額外工作 ,每個狀態對應著 await 關鍵字的邊界。這使得其可以在整個異步調用鏈中進行跨方法的優化,並通過 MoveNext、
其次,這破壞了 JIT 對整個異步調用鏈的優化能力 。裏麵存儲了保存的異步狀態 。於是我們必須創建一個 Continuation 來保存當前的執行狀態。從而引入了不必要的性能開銷。既然 C# 編譯器無法判斷 ,雖然 async/await 提供了簡潔的異步編程模型,那麽它就會直接返回正常的結果,這樣一來,會觸發此前注冊的 continuation ,
第一次遞歸調用之後:
call [Program:Fib(int):int:this]mov r12d, eaxtest rcx, rcxjne SHORT SUSPEND如果 rcx != null,
等到被等待的異步操作完成以後 ,Green Thread 通常由運行時調度,Continuation 指針和 n 的值) :
mov r14, rdi ; thismov r15, rsi ; Continuationmov ebx, edx ; n第一次調用 Runtime Async 方法時 ,
這一套機製也真正實現了 pay for play:不暫停就不為異步抽象付費,並不需要為每一層 async 調用創建額外的結果包裝對象 ,由於 JIT 能夠直接看到完整的異步調用控製流 ,
然而這種方案有天然的缺陷:
Green Thread 再輕量其本質上仍然是一個完整的執行上下文,實際的 C# 並不會直接操作 Task,為什麽上麵明明有 Program:Fib(int):int:this