Async todo el camino hacia abajo?

Intentando entender el nuevo patrón async / await, tengo una pregunta a la que no puedo encontrar respuesta, a saber, si debo decorar mis métodos con async, si tengo la intención de llamar a esos métodos desde otras funciones async, o simplemente regresarTasks donde sea apropiado?

En otras palabras, ¿cuál de estas clases A, B o C es mejor y por qué?

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(...);
      }
}

Parece redundante decorar en exceso los métodos, así que naturalmente me inclino haciaC, pero al mismo tiempo se siente un poco incómodo trabajar conTask<T> a menos que uses elawait palabra clave.

Respuestas a la pregunta(2)

Su respuesta a la pregunta