CA2007: Não aguarde diretamente uma tarefa
Property | valor |
---|---|
ID da regra | CA2007 |
Título | Não aguarde diretamente uma tarefa |
Categoria | Fiabilidade |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Não |
Motivo
Um método assíncrono aguarda um Task diretamente.
Descrição da regra
Quando um método assíncrono aguarda um Task diretamente, a continuação geralmente ocorre no mesmo thread que criou a tarefa, dependendo do contexto assíncrono. Esse comportamento pode ser caro em termos de desempenho e pode resultar em um impasse no thread da interface do usuário. Considere ligar Task.ConfigureAwait(Boolean) para sinalizar sua intenção de continuação.
Como corrigir violações
Para corrigir violações, ligue ConfigureAwait para o aguardado Task. Você pode passar um ou true
false
para o continueOnCapturedContext
parâmetro.
Chamar
ConfigureAwait(true)
a tarefa tem o mesmo comportamento que não chamar ConfigureAwaitexplicitamente . Ao chamar explicitamente esse método, você está informando aos leitores que deseja intencionalmente executar a continuação no contexto de sincronização original.Chame
ConfigureAwait(false)
a tarefa para agendar continuações para o pool de threads, evitando assim um impasse no thread da interface do usuário. A aprovaçãofalse
é uma boa opção para bibliotecas independentes de aplicativos.
Exemplo
O trecho de código a seguir gera o aviso:
public async Task Execute()
{
Task task = null;
await task;
}
Para corrigir a violação, ligue ConfigureAwait para o aguardado Task:
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Quando suprimir avisos
Este aviso destina-se a bibliotecas, onde o código pode ser executado em ambientes arbitrários e onde o código não deve fazer suposições sobre o ambiente ou como o chamador do método pode estar invocando ou aguardando nele. Geralmente, é apropriado suprimir totalmente o aviso para projetos que representam o código do aplicativo em vez do código da biblioteca; na verdade, executar esse analisador no código do aplicativo (por exemplo, manipuladores de eventos de clique de botão em um projeto WinForms ou WPF) provavelmente levará a ações erradas sendo tomadas.
Você pode suprimir esse aviso em qualquer situação em que a continuação deva ser agendada de volta ao contexto original ou onde não haja esse contexto em vigor. Por exemplo, ao escrever código em um manipulador de eventos de clique de botão em um aplicativo WinForms ou WPF, em geral, a continuação de um await deve ser executada no thread da interface do usuário e, portanto, o comportamento padrão de agendar a continuação de volta ao contexto de origem é desejável. Como outro exemplo, ao escrever código em um aplicativo ASP.NET Core, por padrão, não SynchronizationContext há ou TaskScheduler, razão pela qual um ConfigureAwait
não mudaria nenhum comportamento.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2007.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Configurar código para análise
Use as opções a seguir para configurar em quais partes da base de código executar essa regra.
Você pode configurar todas essas opções apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Confiabilidade) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.
Excluir métodos vazios assíncronos
Você pode configurar se deseja excluir métodos assíncronos que não retornam um valor dessa regra. Para excluir esses tipos de métodos, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true
# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true
Tipo de saída
Você também pode configurar a quais tipos de assembly de saída aplicar essa regra. Por exemplo, para aplicar essa regra somente ao código que produz um aplicativo de console ou uma biblioteca vinculada dinamicamente (ou seja, não um aplicativo de interface do usuário), adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary