Atualização: o ASP.NET Core não possui umSynchronizationContext
. Se você estiver no ASP.NET Core, não importa se você usa ConfigureAwait(false)
ou não.
Para o ASP.NET "Completo" ou "Clássico" ou o que for, o restante desta resposta ainda se aplica.
Postagem original (para ASP.NET não Core):
Este vídeo da equipe do ASP.NET tem as melhores informações sobre o uso async
no ASP.NET.
Eu tinha lido que é mais eficiente, pois não precisa alternar os contextos de thread para o contexto de thread original.
Isso ocorre com aplicativos de interface do usuário, onde há apenas um thread da interface do usuário no qual você precisa "sincronizar".
No ASP.NET, a situação é um pouco mais complexa. Quando um async
método retoma a execução, ele pega um thread do pool de threads do ASP.NET. Se você desativar a captura de contexto usando ConfigureAwait(false)
, o encadeamento continuará executando o método diretamente. Se você não desativar a captura de contexto, o encadeamento entrará novamente no contexto de solicitação e continuará a executar o método.
Portanto ConfigureAwait(false)
, você não economiza um salto de thread no ASP.NET; ele economiza a reinserção do contexto da solicitação, mas isso normalmente é muito rápido. ConfigureAwait(false)
pode ser útil se você estiver tentando fazer uma pequena quantidade de processamento paralelo de uma solicitação, mas realmente o TPL é mais adequado para a maioria desses cenários.
No entanto, com o ASP.NET Web Api, se sua solicitação estiver chegando em um thread, e você aguardar alguma função e chamar ConfigureAwait (false) que poderia potencialmente colocá-lo em um segmento diferente quando você retornar o resultado final da função ApiController .
Na verdade, apenas fazer um await
pode fazer isso. Depois que seu async
método atinge um await
, o método é bloqueado, mas o thread retorna ao pool de threads. Quando o método está pronto para continuar, qualquer encadeamento é capturado do conjunto de encadeamentos e usado para retomar o método.
A única diferença ConfigureAwait
faz no ASP.NET é se esse thread entra no contexto da solicitação ao retomar o método.
Tenho mais informações básicas no meu artigo do MSDNSynchronizationContext
e na async
publicação do meu blog de introdução .
HttpContext.Current
é transmitido pelo ASP.NETSynchronizationContext
, que é transmitido por padrão quando vocêawait
, mas não é transmitido porContinueWith
. OTOH, o contexto de execução (incluindo restrições de segurança) é o contexto mencionado no CLR via C # e é transmitido por ambosContinueWith
eawait
(mesmo se você usarConfigureAwait(false)
).