C# 只有一个等待的异步

C# 只有一个等待的异步,c#,.net,asynchronous,parallel-processing,C#,.net,Asynchronous,Parallel Processing,这个代码有意义吗 async Task DoSomething() { await service.doSomething(); } 这是不是很相似 Task DoSomething() { return service.doSomething(); } 还是跟这个一样 void DoSomething() { service.doSomething().Wait(); } 在这种情况下,哪种代码最好?您的初始示例: async Task DoSom

这个代码有意义吗

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
或类似版本)创建了一个特殊类,如果不使用async,则不会创建该类

另一方面,应尽可能避免使用第二个示例(使用
.Wait()
)。它说明了两个问题:

  • 使用
    .Wait
    意味着您选择退出
    async
    ,这会破坏整个要点。(现在在调用线程和块上调用“异步”代码)
  • 使用
    .Wait
    通常也会导致线程死锁,最好通过允许
    Wait
    语义在代码中传播来解决
    • 您最初的示例:

      async Task DoSomething() 
      {
           await service.doSomething();
      }
      
      是一个比第一个备选方案效率稍低的版本:

      Task DoSomething() 
      {
          return service.doSomething();
      }   
      
      它的成本更高,因为它必须创建与异步代码相关的整个状态机,而上面显示的版本不需要这样做。如果要使用诸如IlSpy之类的反汇编程序并检查编译器生成的符号,您会看到为
      async
      版本(
      DoSomething
      或类似版本)创建了一个特殊类,如果不使用async,则不会创建该类

      另一方面,应尽可能避免使用第二个示例(使用
      .Wait()
      )。它说明了两个问题:

      • 使用
        .Wait
        意味着您选择退出
        async
        ,这会破坏整个要点。(现在在调用线程和块上调用“异步”代码)
      • 使用
        .Wait
        通常也会导致线程死锁,最好通过允许
        Wait
        语义在代码中传播来解决

      在哪种情况下?在哪种情况下?但第一个例子不一定是错的,对吗?这只是无济于事?对。这只是有点低效。在大多数情况下,您可能应该忽略此处的性能影响,选择您认为最可读的内容。我认为还应该指出这样一个事实,即当
      同步上下文。当前
      不是
      null
      ,而是第一个代码段(带有
      await
      ,但没有
      ConfigureAwait(false)
      )引入死锁的可能性(如果调用方阻止返回的
      任务的完成),在此之前可能没有死锁。这本身就是远离
      async/await
      的一个很好的理由,否则它不会增加任何价值。@KirillShlenskiy,我从未想过这一点。这是一个很好的观点。但是第一个例子不一定是错的,对吗?这只是无济于事?对。这只是有点低效。在大多数情况下,您可能应该忽略此处的性能影响,选择您认为最可读的内容。我认为还应该指出这样一个事实,即当
      同步上下文。当前
      不是
      null
      ,而是第一个代码段(带有
      await
      ,但没有
      ConfigureAwait(false)
      )引入死锁的可能性(如果调用方阻止返回的
      任务的完成),在此之前可能没有死锁。这本身就是远离
      async/await
      的一个很好的理由,否则它不会增加任何价值。@KirillShlenskiy,我从未想过这一点。这是一个伟大的观点。