这段代码有意义吗?
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
来解决。通过代码传播的语义。
关于c# - 异步,只有一个等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516743/