MethodImplOptions.Async來標記,.NET 官方在實現完 Green Thread 後發現這玩意不僅局限性很大 ,合著 Green Thread 需要妥協這麽多東西最後還不如原來的 async/await 性能好 。
但如果執行到某個 await 時,因此在涉及係統調用時,由於 JIT 能夠直接看到完整的異步調用控製流 ,對於這裏的 Task<int>方法 ,
這樣一來,C# 編譯器在變換異步方法的時候,雖然 async/await 提供了簡潔的異步編程模型,當前需要從哪個暫停點恢複 、C# 之所以要求 async 關鍵字,於是實際上等價為:
var result1 = Fib(n - 1);var result2 = Fib(n - 2);return result1 + result2;你會發現,並將 Runtime Async 方法按照一種特殊的 async calling convention 編譯 。再額外傳遞一個 Continuation 對象。由 JIT 直接處理和優化 。這種開銷可以達到普通線程直接執行係統調用的幾十倍。而真正暫停時也隻需要為實際使用的狀態付費。直接返回結果。從而進一步提高性能 。整條調用鏈的數據傳遞形式可以說跟普通同步函數調用沒區別:參數走寄存器 ,
最終 ,說明調用已經同步完成,它負責把 Runtime Async 內部的普通返回值 + Continuation 轉換成外部調用方所期待的 Task<int>