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.
| Property | valor |
|---|---|
| Nome do tipo | ForwardCancellationTokenToInvocations |
| ID da regra | CA2016 |
| Título | Encaminhar o parâmetro CancellationToken para métodos que usam um |
| Categoria | Fiabilidade |
| A correção está quebrando ou não quebrando | Sem quebra |
| Habilitado por padrão no .NET 10 | Como sugestão |
Motivo
Esta regra localiza invocações de método que poderiam aceitar um CancellationToken parâmetro, mas não estão passando nenhum, e sugere encaminhar o método CancellationToken pai para eles.
Descrição da regra
Esta regra analisa definições de método que tomam a CancellationToken como seu último parâmetro e, em seguida, analisa todos os métodos invocados em seu corpo. Se qualquer uma das invocações de método puder aceitar um CancellationToken como o último parâmetro ou ter uma sobrecarga que tome um CancellationToken como o último parâmetro, a regra sugere usar essa opção em vez disso para garantir que a notificação de cancelamento seja propagada para todas as operações que podem ouvi-la.
Nota
A regra CA2016 está disponível em todas as versões do .NET em que o CancellationToken tipo está disponível. Para as versões aplicáveis, consulte a seção CancellationToken "Aplica-se a".
Como corrigir violações
Você pode corrigir violações manualmente ou usar a correção de código disponível no Visual Studio. Passe o cursor sobre a lâmpada que aparece ao lado da invocação do método e selecione a alteração sugerida.
O exemplo a seguir mostra duas alterações sugeridas:
É seguro suprimir uma violação dessa regra se você não estiver preocupado em encaminhar a notificação de operação cancelada para invocações de método inferiores. Você também pode passar default explicitamente em C# (Nothing no Visual Basic) ou None suprimir a violação da regra.
A regra pode detetar uma variedade de violações. Os exemplos a seguir mostram casos que a regra pode detetar:
Exemplo 1
A regra sugerirá o encaminhamento ct do parâmetro de para a MyMethod invocação, porque o método define um parâmetro de MyMethodWithDefault token opcional:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Correção:
Encaminhe o ct parâmetro:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(ct);
}
Se você não estiver preocupado em encaminhar notificações de cancelamento para invocações mais baixas, você pode:
Passe defaultexplicitamente:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(default);
}
Ou passar CancellationToken.Noneexplicitamente:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(CancellationToken.None);
}
Exemplo 2
A regra sugerirá o encaminhamento ct do MyMethod parâmetro de para a MyMethodWithOverload invocação, porque o método tem uma sobrecarga que usa um CancellationToken parâmetro:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload()
{
}
public static void MyMethodWithOverload(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
Correção:
Encaminhe o ct parâmetro:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(ct);
}
Se você não estiver preocupado em encaminhar notificações de cancelamento para invocações mais baixas, você pode:
Passe defaultexplicitamente:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(default);
}
Ou passar CancellationToken.Noneexplicitamente:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(CancellationToken.None);
}
Exemplos de não violação
O CancellationToken parâmetro no método pai não está na última posição:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct, int lastParameter)
{
MyMethodWithDefault();
}
}
}
O CancellationToken parâmetro no método padrão não está na última posição:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
O CancellationToken parâmetro no método de sobrecarga não está na última posição:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(int lastParameter)
{
}
public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
O método pai define mais de um CancellationToken parâmetro:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct1, CancellationToken ct2)
{
MyMethodWithDefault();
}
}
}
O método com padrões define mais de um CancellationToken parâmetro:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct1 = default, CancellationToken ct2 = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
A sobrecarga do método define mais de um CancellationToken parâmetro:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(CancellationToken ct1, CancellationToken ct2)
{
}
public static void MyMethodWithOverload()
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload();
}
}
}
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 CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.