仅与一个等待异步

本文关键字:一个 等待 异步 | 更新日期: 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语义在代码中传播来解决。