Skip to main content

ConfigureAwait

  • ConfigureAwait

1686674104695.jpg

Explicação

Noções básicas sobre ConfigureAwait em C# .NET: usando contextos de sincronização e tratamento de exceções

Em C# .NET, o método ConfigureAwait é usado para configurar como uma tarefa assíncrona deve ser retomada em um thread após ter sido aguardada. Especificamente, ele determina se a continuação da tarefa deve ocorrer no mesmo contexto de sincronização (como o thread de UI em um aplicativo de desktop) ou em um thread diferente.

Quando você aguarda uma tarefa sem usar ConfigureAwait, por padrão, a continuação da tarefa será retomada no mesmo contexto de sincronização em que a tarefa foi originalmente iniciada. Isso pode ser problemático se a tarefa for de longa duração e prender o thread da UI, impedindo que o usuário interaja com o aplicativo até que a tarefa seja concluída. Nesse caso, você pode usar ConfigureAwait(false) para indicar que a continuação deve ser executada em um thread do pool de threads em vez do thread da UI.

Entretanto, há casos em que você deseja garantir que a continuação de uma tarefa seja executada no contexto de sincronização original. Isto é particularmente importante se a tarefa executa operações que interagem com a UI, como atualizar um controle ou exibir uma caixa de diálogo. Nesses casos, você deve usar ConfigureAwait(true) ou simplesmente omitir ConfigureAwait completamente para indicar que a continuação deve ser executada no contexto de sincronização original.

Em relação às exceções, ao utilizar ConfigureAwait(false), quaisquer exceções que ocorram durante a execução da tarefa não serão propagadas para o contexto de sincronização original. Em vez disso, eles serão observados no thread do pool de threads que executa a continuação. Isso pode dificultar o tratamento de exceções de maneira consistente e previsível, pois o código que trata a exceção precisará ser executado no thread do pool de threads.

Em geral, é uma boa prática usar ConfigureAwait(false) quando você não precisar garantir que a continuação seja executada no contexto de sincronização original e usar ConfigureAwait(true) ou omitir ConfigureAwait quando precisar garantir que a continuação é executado no contexto de sincronização original. E é importante estar ciente de como as exceções são tratadas ao usar ConfigureAwait(false) e garantir que qualquer código de tratamento de exceção seja executado no thread apropriado.

.NET8

  • No .NET 8 é adicionado um novo tipo que fornece todas as maneiras diferentes de configurar aguardáveis
  • Artigo
namespace System.Threading.Tasks;
[Flags]
public enum ConfigureAwaitOptions
{
None = 0x0,
ContinueOnCapturedContext = 0x1,
SuppressThrowing = 0x2,
ForceYielding = 0x4,
}