Partilhar via


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

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:

Regra CA2016 - Encaminhar o parâmetro CancellationToken para métodos que usam 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 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.