Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| 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:
- System.Threading.Tasks.TaskFactory.StartNew Metodologia
- System.Threading.Tasks.Task.ContinueWith Metodologia
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.
Nota
VSTHRD105 - Evite sobrecargas de método que pressupõem que TaskScheduler.Current é uma regra semelhante implementada no pacote Microsoft.VisualStudio.Threading.Analyzers .
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.