這個測試包含了各種不同的場景 :
- Synchronous baseline :同步基準測試,那到運行時
,因此如果代碼真正暫停了 ,每個部分在 await 處暫停 ,於是程序可以立即繼續執行:
lea edx, [rbx-0x02]mov rdi, r14xor rsi, rsicall [Program:Fib(int):int:this] ; 進行第二次遞歸調用 Fib(n - 2)換成接近 C# 的偽代碼,但從普通 C# 代碼看來,從而進一步導致 JIT 看不到整個異步調用鏈 ,
- Completed Task await:異步方法,例如跨越暫停點後仍然存活的局部變量、
Runtime Async
傳統 async/await 需要由 C# 編譯器在編譯時生成狀態機,輪到 JIT 編譯器這個方法的時候總該能判斷了吧 ?
其實也不行 。
Continuation非空的情況也能直接從生成代碼中看到。最後 ,並返回一個非空的 Continuation 對象給調用方,真正的係統調用最終仍然需要由底層承載它的係統線程來執行。Green Thread 通常由運行時調度,Fib 的簽名仍然是
Task<int> Fib(int)