【C# TAP 非同步程式設計】一 、async 標誌
阿新 • • 發佈:2021-12-17
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都會阻塞執行緒
程式設計是個人愛好