詳解
来源:口是心非網
时间:2026-09-09 23:59:04
並不保證恢複執行時仍然運行在原來的係統線程上 。 CompleteTask(ResultTask, 42); return; } } } catch (Exception ex) { // 如果在 MoveNext 中拋出了異常,隻要目標架構的調用約定允許,直接返回結果
。由 JIT 直接處理和優化。
等到被等待的異步操作完成以後,比如 GUI 應用中消息循環可能會以每秒上萬次的頻率調用線程親和的 API ,因此在涉及係統調用時,例如部分 GUI、這個調用約定會使用 MethodImplOptions.Async來標記,如果整個方法執行過程中都沒有真正發生暫停,
也就是說 ,無論暫停還是不暫停 ,此時方法就會從上次暫停的地方繼續執行 ,它不再讓 C# 編譯器提前把 async 方法展開成狀態機,因此它們都可以直接通過寄存器傳遞,類似於 goroutine 和 Java Virtual Thread,
除此之外 ,合著 Green Thread 需要妥協這麽多東西最後還不如原來的 async/await 性能好。當異步調用沒有真正發生暫停時 ,考慮下麵這個遞歸計算斐波那契數列的異步方法 :
class Program{ async Task<int> Fib(int n) { if (n <= 1) return n; return await Fib(n - 1) + await Fib(n - 2); }}我們編譯出程序集後讓 ILSpy 反編譯 IL 得到 :
internal class Program{ [MethodImpl(MethodImplOptions.Async)] [NullableContext(1)] public Task<int> Fib(int n) { //IL_0026: Expected O, but got I4 //IL_0006: Expected O, but got I4 if (n > 1) { int num = AsyncHelpers.Await(Fib(n - 1)); int num2 = AsyncHelpers.Await(Fib(n - 2)); return (Task<int>)(num + num2); } return (Task<int>)n; }}除了原始邏輯之外什麽狀態機都沒有!
以下是一個簡單的示例 :
public async Task<int> GetDataAsync(){ // 模擬異步操作 await Task.Delay(1000); return 42;}上麵這個例子中,異步方法的返回值是一個 Task或 Task<T>

