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 asyncno 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 asyncmé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 awaitpode fazer isso. Depois que seu asyncmé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 asyncpublicaçã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 ambosContinueWitheawait(mesmo se você usarConfigureAwait(false)).