Partilhar via


CA2016: Encaminhar o parâmetro CancellationToken para métodos que aceitam um

Propriedade valor
Nome do tipo EncaminharTokenDeCancelamentoParaChamadas
ID da regra CA2016
Título Reencaminhar o parâmetro CancellationToken para métodos que aceitam um
Categoria Fiabilidade
A correção causa interrupção ou não Ininterrupto
Habilitado por padrão no .NET 10 Como sugestão
Línguas aplicáveis C# e Visual Basic

Motivo

Esta regra localiza invocações de método que poderiam aceitar um CancellationToken parâmetro, mas que não passam nenhum, e sugere encaminhar o CancellationToken parâmetro do método pai para elas.

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, ver a secção "Aplica-se a" do CancellationToken.

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:

Regra CA2016 - Encaminhar o parâmetro CancellationToken para métodos que aceitam um

É 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 do parâmetro ct de MyMethod para a invocação MyMethodWithDefault, porque o método define um parâmetro 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 parâmetro ct

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 do parâmetro MyMethodct para a invocação MyMethodWithOverload, porque o método tem uma sobrecarga que aceita um parâmetro CancellationToken:

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 parâmetro ct.

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 default explicitamente:

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.