C# 编译器借助 .NET 框架基类库实现了异步功能。运行时本身无需任何更改即可支持异步。这意味着 await 是被转换成了某种使用早期版本的 C# 我们自己就可以编写的东西。我们可以使用 .NET Reflector 这样的反编译器来查看生成的代码。
除了单纯的感兴趣之外,理解这些生成的代码还有助于调试、性能分析以及对异步代码进行其他诊断。
存根方法(Stub Method)
异步方法被替换为存根方法。调用异步方法时,首先运行的是存根方法。让我们以这个简单的异步方法为例:
public async Task<int> AlexsMethod()
{
int foo = 3;
await Task.Delay(500);
return foo;
}
编译器生成的存根方法如下所示:
public Task<int> AlexsMethod()
{
<AlexsMethod>d__0 stateMachine = new <AlexsMethod>d__0();
stateMachine.<>4__this = this;
stateMachine.<>t__builder = AsyncTaskMethodBuilder<int>.Create();
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.S
订阅专栏 解锁全文

457

被折叠的 条评论
为什么被折叠?



