这段代码有意义吗?
async Task DoSomething() {
await service.doSomething();
}
这与此类似吗?
Task DoSomething() {
return service.doSomething();
}
或者它与此相同吗?
void DoSomething() {
service.doSomething().Wait();
}
在这种情况下,哪种代码最好?
答案 0 :(得分:4)
您的初步示例:
async Task DoSomething()
{
await service.doSomething();
}
是比第一种选择稍微低效的版本:
Task DoSomething()
{
return service.doSomething();
}
它更昂贵,因为它必须创建与异步代码相关的整个状态机,而上面显示的版本不需要这样。如果您使用像IlSpy这样的反汇编程序并检查编译器生成的符号,您会发现为async
版本(DoSomething<d__0>
或某些此类版本)创建了一个特殊类如果您不使用异步,则创建。
另一方面,应尽可能避免使用.Wait()
的第二个示例。它说明了两个问题:
.Wait
表示您选择退出async
,这会使整个观点失败。 (&#34; async&#34;代码现在在调用线程和块上调用).Wait
通常也会导致线程死锁,最好通过允许await
语义在代码中传播来解决。