Sdílet prostřednictvím


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 10 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:

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

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 ctMyMethod z MyMethodWithDefault 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 ct)
        {
            MyMethodWithDefault();
        }
    }
}

Opravit:

Přeposlání parametru ct :

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

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 ct)
{
    MyMethodWithDefault(default);
}

Nebo explicitně předat CancellationToken.None:

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

Příklad 2

Pravidlo navrhne předání parametru ctMyMethod z MyMethodWithOverload 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 ct)
        {
            MyMethodWithOverload();
        }
    }
}

Opravit:

Přeposlání parametru ct :

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

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 ct)
{
    MyMethodWithOverload(default);
}

Nebo explicitně předat CancellationToken.None:

public static void MyMethod(CancellationToken ct)
{
    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 ct, 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 ct)
        {
            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 ct)
        {
            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 ct1, CancellationToken ct2)
        {
            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 ct1 = default, CancellationToken ct2 = default)
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            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 ct1, CancellationToken ct2)
        {
        }

        public static void MyMethodWithOverload()
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            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.