CA2016: Przekaż parametr CancellationToken do metod, które przyjmują jeden

Właściwości Wartość
Nazwa typu ForwardCancellationTokenToInvocations
Identyfikator reguły CA2016
Tytuł Prześlij dalej parametr CancellationToken do metod, które go przyjmują
Kategoria Niezawodność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Ta reguła lokalizuje wywołania metod, które mogą akceptować CancellationToken parametr, ale nie są przekazywane, i sugeruje przekazanie do nich metody nadrzędnej CancellationToken .

Opis reguły

Ta reguła analizuje definicje metod, które przyjmują CancellationToken jako ostatni parametr, a następnie analizuje wszystkie metody wywoływane w jego treści. Jeśli którykolwiek z wywołań metody może zaakceptować CancellationToken jako ostatni parametr lub mieć przeciążenie, które przyjmuje CancellationToken jako ostatni parametr, reguła sugeruje użycie tej opcji zamiast tego, aby upewnić się, że powiadomienie anulowania zostanie rozpropagowane do wszystkich operacji, które mogą go nasłuchiwać.

Uwaga

Reguła CA2016 jest dostępna we wszystkich wersjach platformy .NET, w których CancellationToken typ jest dostępny. Odpowiednie wersje można znaleźć w sekcji CancellationToken "Dotyczy".

Jak naprawić naruszenia

Naruszenia można naprawić ręcznie lub użyć poprawki kodu dostępnej w programie Visual Studio. Umieść kursor na żarówki, która jest wyświetlana obok wywołania metody i wybierz sugerowaną zmianę.

W poniższym przykładzie przedstawiono dwa sugerowane zmiany:

Rule CA2016 - Forward the CancellationToken parameter to methods that take one

Można bezpiecznie pominąć naruszenie tej reguły, jeśli nie obawiasz się przekazywania powiadomienia o anulowanej operacji do niższych wywołań metod. Możesz również jawnie przekazać default kod C# (Nothing w Visual Basic) lub None pominąć naruszenie reguły.

Reguła może wykrywać różne naruszenia. W poniższych przykładach pokazano przypadki, w których reguła może wykryć:

Przykład 1

Reguła sugeruje przekazywanie parametru c z MyMethod do MyMethodWithDefault wywołania, ponieważ metoda definiuje opcjonalny parametr tokenu:

using System.Threading;

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

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

Naprawa:

c Prześlij dalej parametr:

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

Jeśli nie martwisz się o przekazywanie powiadomień o anulowaniu do niższych wywołań, możesz wykonać następujące czynności:

Jawne przekazywanie default:

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

Lub jawnie przekaż :CancellationToken.None

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

Przykład 2

Reguła sugeruje przekazywanie parametru c z MyMethod do MyMethodWithOverload wywołania, ponieważ metoda ma przeciążenie, które przyjmuje CancellationToken parametr:

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();
        }
    }
}

Naprawa:

c Prześlij dalej parametr:

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

Jeśli nie martwisz się o przekazywanie powiadomień o anulowaniu do niższych wywołań, możesz wykonać następujące czynności:

Jawne przekazywanie default:

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

Lub jawnie przekaż :CancellationToken.None

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

Przykłady braku naruszeń

Parametr CancellationToken w metodzie nadrzędnej nie znajduje się w ostatniej pozycji:

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();
        }
    }
}

Parametr CancellationToken w metodzie domyślnej nie znajduje się w ostatniej pozycji:

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();
        }
    }
}

Parametr CancellationToken w metodzie przeciążenia nie znajduje się w ostatniej pozycji:

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();
        }
    }
}

Metoda nadrzędna definiuje więcej niż jeden CancellationToken parametr:

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();
        }
    }
}

Metoda z wartościami domyślnymi definiuje więcej niż jeden CancellationToken parametr:

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();
        }
    }
}

Przeciążenie metody definiuje więcej niż jeden CancellationToken parametr:

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();
        }
    }
}

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.