Assíncrono todo o caminho?

Tentando entender o novo padrão async / await, eu tenho uma pergunta que não consigo encontrar uma resposta, ou seja, se eu deveria decorar meus métodos com async, se eu pretendo chamar esses métodos de outras funções assíncronas, ou apenas retornarTasks onde apropriado?

Em outras palavras, qual dessas classes A, B ou C é melhor e 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 overdecorate métodos, então eu naturalmente inclino em direçãoC, mas ao mesmo tempo parece um pouco estranho trabalhar comTask<T> a menos que você use oawait palavra chave.

questionAnswers(2)

yourAnswerToTheQuestion