CA2016: Předání parametru CancellationToken metodám, které berou jeden

Vlastnost Hodnota
Název typu ForwardCancellationTokenToInvocations
ID pravidla CA2016
Název Přeposlat parametr CancellationToken metodám, které ho přijmou
Kategorie Spolehlivost
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Toto pravidlo vyhledá vyvolání metody, které by mohly přijmout CancellationToken parametr, ale nepředají žádné, a navrhuje předat nadřazenou metodu CancellationToken jim.

Popis pravidla

Toto pravidlo analyzuje definice metody, které jako poslední parametr přebírají CancellationToken , a pak analyzuje všechny metody vyvolané v těle. Pokud některá z vyvolání metody může buď přijmout CancellationToken jako poslední parametr, nebo mít přetížení, které přebírá CancellationToken jako poslední parametr, pak pravidlo navrhne použití této možnosti, aby se zajistilo, že se oznámení o zrušení rozšíří do všech operací, které ho mohou poslouchat.

Poznámka:

Pravidlo CA2016 je k dispozici ve všech verzích .NET, ve kterých CancellationToken je typ dostupný. Informace o příslušných verzích najdete v části CancellationToken "Platí pro".

Jak opravit porušení

Porušení můžete opravit ručně nebo můžete použít opravu kódu dostupnou v sadě Visual Studio. Najeďte myší na žárovku, která se zobrazí vedle vyvolání metody, a vyberte navrženou změnu.

Následující příklad ukazuje dvě navrhované změny:

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

Je bezpečné potlačit porušení tohoto pravidla, pokud vás nezajímá přesměrování oznámení o zrušené operaci na volání nižší metody. Můžete také explicitně předat default jazyk C# (Nothing v jazyce Visual Basic) nebo None potlačit porušení pravidla.

Pravidlo může detekovat různá porušení. Následující příklady ukazují případy, které pravidlo dokáže rozpoznat:

Příklad 1

Pravidlo navrhne předání parametru cMyMethodWithDefault z MyMethod vyvolání, protože metoda definuje volitelný 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();
        }
    }
}

Opravit:

Přeposlání parametru c :

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

Pokud vás nezajímá přesměrování oznámení o zrušení na nižší počet volání, můžete:

Explicitní předání default:

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

Nebo explicitně předat CancellationToken.None:

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

Příklad 2

Pravidlo navrhne předání parametru cMyMethodWithOverload z MyMethod vyvolání, protože metoda má přetížení, které přebírá 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();
        }
    }
}

Opravit:

Přeposlání parametru c :

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

Pokud vás nezajímá přesměrování oznámení o zrušení na nižší počet volání, můžete:

Explicitní předání default:

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

Nebo explicitně předat CancellationToken.None:

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

Příklady porušení předpisů

Parametr CancellationToken v nadřazené metodě není na poslední pozici:

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 ve výchozí metodě není na poslední pozici:

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 v metodě přetížení není na poslední pozici:

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

Nadřazená metoda definuje více než 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 s výchozími hodnotami definuje více než 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();
        }
    }
}

Přetížení metody definuje více než 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();
        }
    }
}

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.