Partilhar via


CA2007: Não aguarde diretamente uma tarefa

Propriedade valor
ID da regra CA2007
Cargo 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 8 Não

Causa

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 truefalse 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ção false é 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 há ou TaskScheduler, razão pela qual um ConfigureAwait não SynchronizationContext 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

Consulte também