No final de um método asynchronous, devo retornar ou aguardar?

No final de um método asynchronous de devolução de tarefas, se eu chamar outro método asynchronous, eu poderia await lo ou return sua tarefa. Quais são as consequências de cada um?

  Task FooAsync() { return BazAsync(); // Option A } async Task BarAsync() { await BazAsync(); // Option B } 

Você não pode retornar a tarefa se o método em si for declarado como async – portanto, isso não funcionará, por exemplo:

 async Task BarAsync() { return BazAsync(); // Invalid! } 

Isso exigiria um tipo de retorno de Task .

Se o seu método está apenas realizando uma pequena quantidade de trabalho e, em seguida, chamando apenas um método asynchronous, sua primeira opção é aceitável e significa que há menos uma tarefa envolvida. Você deve estar ciente de que quaisquer exceções lançadas em seu método síncrono serão entregues de forma síncrona – na verdade, é assim que eu prefiro lidar com a validação de argumentos.

Também é um padrão comum para implementar sobrecarga, por exemplo, por token de cancelamento.

Esteja ciente de que, se precisar mudar para aguardar outra coisa, você precisará torná-lo um método asynchronous. Por exemplo:

 // Version 1: Task BarAsync() { // No need to gronkle yet... return BazAsync(); } // Oops, for version 2 I need to do some more work... async Task BarAsync() { int gronkle = await GronkleAsync(); // Do something with gronkle // Now we have to await BazAsync as we're now in an async method await BazAsync(); } 

Confira este link onde está descrito: http://msdn.microsoft.com/pt-br/library/vstudio/hh191443.aspx

 async Task TaskOfTResult_MethodAsync() { int hours; // . . . // The body of the method should contain one or more await expressions. // Return statement specifies an integer result. return hours; } // Calls to TaskOfTResult_MethodAsync from another async method. private async void CallTaskTButton_Click(object sender, RoutedEventArgs e) { Task returnedTaskTResult = TaskOfTResult_MethodAsync(); int intResult = await returnedTaskTResult; // or, in a single statement //int intResult = await TaskOfTResult_MethodAsync(); } // Signature specifies Task async Task Task_MethodAsync() { // . . . // The body of the method should contain one or more await expressions. // The method has no return statement. } // Calls to Task_MethodAsync from another async method. private async void CallTaskButton_Click(object sender, RoutedEventArgs e) { Task returnedTask = Task_MethodAsync(); await returnedTask; // or, in a single statement //await Task_MethodAsync(); }