1. 程式人生 > 其它 >【C# TAP 非同步程式設計】一 、async 標誌

【C# TAP 非同步程式設計】一 、async 標誌

async的作用:

1、async是一個標誌,告訴編譯器這是一個非同步方法。

2、編譯器會根據這個標誌生成一個非同步狀態機。

3、編譯器將原非同步方法中的程式碼清空,寫入狀態機的配置,原先非同步方法中的程式碼被封裝入狀態機。

async 的非同步方法的刨析

async是什麼呢?我通過一段程式碼來了解,程式碼如下:

namespace MyTask;
  class Program
    {
        public static  void Main(string[] args)
        {
            Task<int> baconTask =  FryBaconAsync(3);
            Console.Read();
        }
        static async Task<int> FryBaconAsync(int slices)
        {
 
        return  3; //整數3和Task<int>不存在隱形轉化啊,怎麼就可以return 3; 如果你也存在這個疑問 請繼續往下閱讀,接下去詳細分析。
        }
}

ILspy反編譯後代碼:

View Code

以下開始分析反編譯後的原始碼:

用到的知識點:IAsyncStateMachine介面、AsyncTaskMethodBuilder<TResult>類,這兩個功能必須詳細理解。

1、編譯器 async標記給非同步方法生成 一個叫AsyncStateMachine非同步狀態機的特性附著於方法上,告訴CLR這是一個非同步狀態機。如下圖所示:

編譯器將原非同步方法中的程式碼清空,寫入狀態機的配置,原先非同步方法中的程式碼被封裝入狀態機。

2、編譯器還生成一個非同步狀態機的類。

該類繼承IAsyncStateMachine介面。IAsyncStateMachine介面有兩個方法:MoveNext()、SetStateMachine();

該類除了以上兩個方法,還有重要兩欄位:AsyncTaskMethodBuilder<TResult> 表示返 回任務的非同步方法生成器。state 狀態。

原始碼中返回值(return 3;)被封裝入非同步狀態機的<>t__builder 欄位中。最後的返回值 return stateMachine.<>t__builder.Task 是Task<TResult>型別。

通過IL程式碼我們就可以清楚的得知async就是語法糖。

注意:awaiter.GetResult()、awaiter.Result都會阻塞執行緒

程式設計是個人愛好