Compartilhar via


CA2016: Encaminhe o parâmetro CancellationToken para os métodos que recebem um

Property Valor
Nome do tipo ForwardCancellationTokenToInvocations
ID da regra CA2016
Título Encaminhe o parâmetro CancellationToken para os métodos que recebem um
Categoria Confiabilidade
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 9 Como sugestão

Causa

Essa regra localiza invocações de método que podem aceitar um parâmetro CancellationToken, mas não estão passando nenhum, e sugere encaminhar CancellationToken do método pai para eles.

Descrição da regra

Essa regra analisa definições de método que pegam um CancellationToken como último parâmetro e então analisa todos os métodos invocados em seu corpo. Se qualquer uma das invocações de método pode aceitar um CancellationToken como o último parâmetro ou tem uma sobrecarga que usa um parâmetro CancellationToken como o último parâmetro, a regra sugere usar essa opção para garantir que a notificação de cancelamento seja propagada para todas as operações que podem ouvi-la.

Observação

A regra CA2016 está disponível em todas as versões do .NET em que o tipo CancellationToken está disponível. Para versões aplicáveis, confira 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. Focalize com o cursor do mouse a lâmpada que aparece ao lado da invocação do método e selecione a alteração sugerida.

O seguinte exemplo mostra duas alterações sugeridas:

Regra CA2016: encaminhar o parâmetro CancellationToken para os métodos que recebem um

É seguro suprimir uma violação dessa regra se você não está preocupado em encaminhar a notificação de operação cancelada para invocações de método inferior. Você também pode passar default explicitamente em C# (Nothing no Visual Basic) ou None para suprimir a violação de regra.

A regra pode detectar uma variedade de violações. Os seguintes exemplos mostram casos que a regra pode detectar:

Exemplo 1

A regra sugerirá o encaminhamento do parâmetro c de MyMethod para a invocação MyMethodWithDefault, pois o método define um parâmetro de token opcional:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault();
        }
    }
}

Correção:

Encaminhe o parâmetro c:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault(c);
        }

Se você não estiver preocupado em encaminhar notificações de cancelamento para invocações mais baixas, poderá:

Passar explicitamente default:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault(default);
        }

Ou passar explicitamente CancellationToken.None:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault(CancellationToken.None);
        }

Exemplo 2

A regra sugerirá o encaminhamento do parâmetro c de MyMethod para a invocação MyMethodWithOverload, pois o método tem uma sobrecarga que usa 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 c)
        {
            MyMethodWithOverload();
        }
    }
}

Correção:

Encaminhe o parâmetro c:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload(c);
        }

Se você não estiver preocupado em encaminhar notificações de cancelamento para invocações mais baixas, poderá:

Passar explicitamente default:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload(default);
        }

Ou passar explicitamente CancellationToken.None:

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload(CancellationToken.None);
        }

Exemplos de não violação

O parâmetro CancellationToken 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 c, int lastParameter)
        {
            MyMethodWithDefault();
        }
    }
}

O parâmetro CancellationToken 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 c)
        {
            MyMethodWithDefault();
        }
    }
}

O parâmetro CancellationToken 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 c)
        {
            MyMethodWithOverload();
        }
    }
}

O método pai define mais de um parâmetro CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken c1, CancellationToken c2)
        {
            MyMethodWithDefault();
        }
    }
}

O método com padrões define mais de um parâmetro CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken c1 = default, CancellationToken c2 = default)
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithDefault();
        }
    }
}

A sobrecarga do método define mais de um parâmetro CancellationToken:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload(CancellationToken c1, CancellationToken c2)
        {
        }

        public static void MyMethodWithOverload()
        {
        }

        public static void MyMethod(CancellationToken c)
        {
            MyMethodWithOverload();
        }
    }
}

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

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