只有一个异步等待

时间:2014-12-17 01:03:42

标签: c# .net asynchronous parallel-processing

这段代码有意义吗?

async Task DoSomething() {
     await service.doSomething();
}

这与此类似吗?

Task DoSomething() {
    return service.doSomething();
}   

或者它与此相同吗?

 void DoSomething() {
    service.doSomething().Wait();
}   

在这种情况下,哪种代码最好?

1 个答案:

答案 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语义在代码中传播来解决。