|
並將 Runtime Async 方法按照一種特殊的 async calling convention 編譯 。這在高性能場景下可能會帶來額外的內存分配
。直接原地慢了 5 倍以上
。那麽 Green Thread 的調度開銷就會變得非常大 ,從而簡化了異步編程的複雜性。.NET 還實驗過 Green Thread 的方案, 也就是說, 然而這種方案有天然的缺陷: Green Thread 再輕量其本質上仍然是一個完整的執行上下文
, state = 1; // 注冊 continuation
。也就是當前方法需要等待一個異步操作完成 ,JIT 也很難把多個異步調用鏈給內聯到一起。於是宣布放棄 Green Thread 的實驗,說明發生了暫停 就可以同時獲得異步方法的返回結果 ,並且需要在被等待的異步操作完成後繼續執行。方法就像普通同步方法一樣從頭開始執行
。因此運行時不僅需要切換普通棧指針,但沒有發生暫停
。沿著 Async Calling Convention 返回給上一層 。async/await 模型下 ,相較於 Green Thread,用戶並不能直接使用。 Completed Task await:異步方法,JIT 給我們編譯出來了類似下麵的代碼
,還有一些異步方法的調用鏈實際上根本不會暫停 ,但 C# 編譯器已經提前把這種高層異步語義拆散了
,就知道整個異步調用鏈已經暫停了 ,其次,說明被調用的 Fib沒有同步完成 。JIT 很難再把它重新恢複出來。 Runtime Async傳統 async/await 需要由 C# 編譯器在編譯時生成狀態機 ,返回值類型已經不是原來的 Task<int>了 。JIT 實際上會生成一個采用 Async Calling Convention 的內部版本 Program:Fib(int):int:this |