Partilhar via


CA2008: Não crie tarefas sem passar por um TaskScheduler

Propriedade valor
ID da regra CA2008
Título Não crie tarefas sem passar por um TaskScheduler
Categoria Fiabilidade
A correção é fixa ou não fixa Ininterrupto
Habilitado por padrão no .NET 10 Não

Motivo

Uma operação de criação ou continuação de tarefas usa uma sobrecarga de método que não especifica um parâmetro TaskScheduler.

Descrição da regra

Os seguintes métodos de criação e continuação de tarefas .NET têm sobrecargas que permitem especificar ou omitir uma TaskScheduler instância:

Especifique sempre um argumento explícito TaskScheduler para evitar o valor padrão Current , cujo comportamento é definido pelo chamador e pode variar em tempo de execução. Current retorna o agendador associado ao que Task está sendo executado no momento nesse thread. Se não houver essa tarefa, ela retornará Default, que representa o pool de threads. O uso de Current pode levar a deadlocks ou problemas de capacidade de resposta da interface de utilizador em algumas situações, quando se pretendia criar a tarefa no pool de threads, mas, em vez disso, aguarda para retomar ao thread da interface de utilizador.

Para obter mais informações e exemplos detalhados, consulte New TaskCreationOptions e TaskContinuationOptions no .NET Framework 4.5.

Como corrigir violações

Para corrigir violações, chame a sobrecarga de método que leva um TaskScheduler e passe explicitamente em Default ou Current para deixar a intenção clara.

Example

// This code violates the rule.
var badTask = Task.Factory.StartNew(
    () =>
    {
        // ...
    }
);
badTask.ContinueWith(
    t =>
    {
        // ...
    }
);

// This code satisfies the rule.
var goodTask = Task.Factory.StartNew(
    () =>
    {
        // ...
    },
    CancellationToken.None,
    TaskCreationOptions.None,
    TaskScheduler.Default
);
goodTask.ContinueWith(
    t =>
    {
        // ...
    },
    CancellationToken.None,
    TaskContinuationOptions.None,
    TaskScheduler.Default
);

Quando suprimir avisos

Este aviso destina-se principalmente 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. Pode ser apropriado suprimir o aviso para projetos que representam o código do aplicativo em vez do código da biblioteca.

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 CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA2008.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Consulte também