class DecompilationSample
{
static void Main()//简单同步方法证明编译器转换 生成的代码
{
Task<int> task = SumCharactersAsync("test");//执行方法
//task Id = 5, Status = System.Threading.Tasks.TaskStatus.RanToCompletion, Method = "{null}", Result = "448"
Console.WriteLine(task.Result);
}
static async Task<int> SumCharactersAsync(IEnumerable<char> text)
{
int total = 0;
// 0
foreach (char ch in text)
//t e s t
{
int unicode = ch;
//116 101 115 116
await Task.Delay(unicode);
total += unicode;
//total 116 217 332 448
}
await Task.Yield();
return total;
}
}
生成的代码
实现基本是状态机,编译器将生成一个私有的内嵌结果,来表示异步方法。结构还必须包含
一个方法,其签名与所声明的方法签名相同。我称其为骨架方法,其他东西都依赖于它。
骨架方法需要创建状态机,并执行一个步骤,然后返回一个表示状态机进度的任务。此后,
骨架方法的运作就此结束。状态机会负责其余事项,后续操作附加到其他异步操作后,可
通知状态机去执行另一个步骤。当之前返回的任务被赋予适当的值后,方法就执行到最后了,
状态机可随即发出信号。
输出
448