做一个 .NET 的开发者,我相信大家对 async / await 两个关键字非常熟悉,对它们用法也应该是驾轻就熟了。虽然使用 async 让我们的开发过程更加轻松,代码变得清晰,更能清楚的表达业务逻辑,但是引入 async / await 并不是完全无痛的。大部分情况下它们都运行的很好,但是稍一不注意就被带到沟里,下面提到的一些问题都是我自己在工作中经常会忽略的一些情况,所以有必要记录下来提醒自己。
先说说常见的 async/await 用法。
async Task<User> GetUserFromApi(string userId)
{
var json = await UserApi.UserJsonById(userId);
return JsonConvert.DeserializeObject<User>(json);
}
就如大家所知道,async 关键字会把这个方法编译成一个实现了 IAsyncStateMachine 的结构,反编译后的代码大概跟下面差不多
[CompilerGenerated]
private struct <GetUserFromApi>d__1 : IAsyncStateMachine
{
void IAsyncStateMachine.MoveNext() {
... }
[DebuggerHidden]
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine){
... }
public int <>1__state;
public AsyncTaskMethodBuilder<User> <>t__builder;
public string userId;
private TaskAwaiter<string> <>u__1;
}
当然我们今天不是来讨论 async / await 的实现细节的,已经有大量的文章已经为我们分析了这些细节。
而在这里我则是要讨论几个在使用 async / await 中常见的一些容易让大家忽视的问题。