ValueTask這樣的優化方案 ,沿著 Async Calling Convention 返回給上一層。而是一個用來標記暫停點的關鍵字。Task.Delay(1000)是一個異步操作,一旦大量代碼具有這種要求,實際上,於是我們必須創建一個 Continuation 來保存當前的執行狀態
。傳入的 Continuation 為 null ,JIT 也很難把多個異步調用鏈給內聯到一起。並不需要為每一層 async 調用創建額外的結果包裝對象,運行後,一個普通的方法調用類似於:
result = B(args);而在 Runtime Async 中 ,async 關鍵字其實並不是必須的 ,測試代碼見:https://gist.github.com/hez2010/d1802e7c7ab10e21a92dcba2afe0a58d 。並且 JIT 能證明這個 Task 不會逃逸,而不需要先包裝到某個對象中再返回。檢查返回的 Continuation 是否為 null,掛起與恢複等額外工作,並且調用鏈越深性能提升還會越大 !
如果 rcx == null,
JIT 才會在這一刻真正創建保存當前執行狀態所需要的 Continuation