异步一直向下?

Gle*_*eno 16 c# async-await c#-5.0

试图理解新的异步/等待模式,我有一个问题,我找不到答案,即如果我应该用异步装饰我的方法,如果我打算从其他异步函数调用这些方法,或只是返回Tasks在适当情况下?

换句话说,这些A,B或C类中哪一个最好,为什么?

class A<T>
{
      public async Task<T> foo1() //Should be consumed
      {
          return await foo2();
      }

      public async Task<T> foo2() //Could be consumed
      {
          return await foo3();
      }

      private async Task<T> foo3() //Private
      {
          return await Task.Run(...);
      }
}

class B<T>
{
      public async Task<T> foo1() //Should be consumed
      {
          return await foo2();
      }

      public async Task<T> foo2() //Could be consumed
      {
          return await foo3();
      }

      private Task<T> foo3() //Private
      {
          return Task.Run(...);
      }
}

class C<T>
{
      public async Task<T> foo1() //Should be consumed
      {
          return await foo2();
      }

      public Task<T> foo2() //Could be consumed
      {
          return foo3();
      }

      private Task<T> foo3() //Private
      {
          return Task.Run(...);
      }
}
Run Code Online (Sandbox Code Playgroud)

过度使用方法似乎是多余的,所以我自然倾向于使用C,但与此同时,Task<T>除非您使用await关键字,否则感觉有些尴尬.

svi*_*ick 9

两个版本的工作效果相同,唯一的区别是当你await在这里使用时,你会受到一些性能损失(因为必须设置状态机并且最有可能使用延续).

因此,它取决于权衡:您是否希望您的方法更有效,但代价是可读性稍差?或者您是否愿意为了可读性而牺牲性能?

通常情况下,我建议您首先考虑可读性,只关注性能,如果分析告诉您它是值得的.但在这种情况下,我认为可读性的增加很小,所以我可能不会使用await.

另请注意,您的课程C仍然不够远:foo1()也不需要await.

  • +1.虽然我会更强烈地说他们都应该*不是'async`.IMO,这不是那么可读......也就是说,**如果**读者理解它是一个等待方法的*返回类型*,而不是*方法本身*. (3认同)