Está chamando Task.Wait () imediatamente após uma operação assíncrona equivalente a executar a mesma operação de forma síncrona?

Em outras palavras, é

var task = SomeLongRunningOperationAsync(); task.Wait(); 

funcionalmente idêntico ao

 SomeLongRunningOperation(); 

Dito de outra maneira, é

 var task = SomeOtherLongRunningOperationAsync(); var result = task.Result; 

funcionalmente idêntico ao

 var result = SomeOtherLongRunningOperation(); 

De acordo com Task.Wait e Inlining , se a tarefa em Wait já começou a execução, Wait tem que bloquear. No entanto, se ele não tiver iniciado a execução, Wait poderá extrair a tarefa de destino do agendador no qual ela foi enfileirada e executá-la inline no thread atual.

Esses dois casos são apenas uma questão de decidir em qual thread a Tarefa será executada, e se você está aguardando o resultado de qualquer maneira, isso importa?

Existe algum benefício em usar o formulário asynchronous no formulário síncrono, se nada for executado entre a chamada assíncrona e o Wait() ?

Aqui estão algumas diferenças:

  1. O cálculo pode ser executado em um thread diferente. Ele pode ser executado no mesmo encadeamento, se essa tarefa for baseada na CPU e puder ser embutida. Isso não é determinístico.
  2. Se nenhum inlining acontecer, mais um thread estará em uso durante o cálculo. Isso geralmente custa 1 MB de memory de pilha.
  3. Exceções serão agrupadas em AggregateException . A pilha de exceções será diferente.
  4. A versão da tarefa pode travar se a computação posta no contexto de synchronization atual.
  5. Se o conjunto de encadeamentos estiver no máximo, isso poderá travar se a tarefa concluir outra tarefa deve ser planejada.
  6. O estado do encadeamento local, como HttpContext.Current (que na verdade não é local de encadeamento, mas quase), pode ser diferente.
  7. Uma interrupção de thread do thread principal não atingirá o corpo da tarefa (exceto no caso de inlining). Não tenho certeza se a espera em si será abortada ou não.
  8. Criando uma Task induz uma barreira de memory porque pode ter um efeito de synchronization.

Isso importa? Decida você mesmo por esta lista.

Existem benefícios para fazer isso? Eu não consigo pensar em nenhum. Se o seu cálculo usar o IO asynchronous, a espera negará os benefícios que o IO asynchronous traz. A única exceção seria o IO fan-out, por exemplo, emitindo 10 solicitações HTTP em paralelo e esperando por elas. Dessa forma, você tem 10 operações ao custo de um thread.

Note que Wait e Result são equivalentes em todos esses aspectos.