仅与一个等待异步
本文关键字:一个 等待 异步 | 更新日期: 2023-09-27 18:34:22
这段代码有意义吗?
async Task DoSomething() {
await service.doSomething();
}
只是这个相似吗?
Task DoSomething() {
return service.doSomething();
}
还是一样?
void DoSomething() {
service.doSomething().Wait();
}
在这种情况下,哪种代码最好?
您的初始示例:
async Task DoSomething()
{
await service.doSomething();
}
比您的第一个替代方案效率稍低的版本:
Task DoSomething()
{
return service.doSomething();
}
它更昂贵,因为它必须创建与异步代码相关的整个状态机,而上面显示的版本不需要这样做。 如果您使用诸如IlSpy之类的反汇编器并检查编译器生成的符号,则会看到为async
版本(DoSomething<d__0>
或类似版本)创建了一个特殊的类,如果您不使用异步,则不会创建该类。
另一方面,你的第二个例子——使用.Wait()
——应该尽可能避免。 它说明了两个问题:
- 使用
.Wait
意味着您选择退出async
,这违背了重点。("异步"代码现在在调用线程和块上调用) - 使用
.Wait
通常还会导致线程死锁,最好通过允许await
语义在代码中传播来解决。