Megosztás a következőn keresztül:


CA2016: A CancellationToken paraméter továbbítása olyan metódusok felé, amelyek egy

Tulajdonság Érték
Típus neve ForwardCancellationTokenToInvocations
Szabályazonosító CA2016
Cím A CancellationToken paraméter továbbítása olyan metódusok számára, amelyek egy
Kategória Megbízhatóság
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

Ez a szabály megkeresi azokat a metódushívásokat, amelyek elfogadhatnak egy paramétert CancellationToken , de nem adnak át egyiket sem, és azt javasolja, hogy továbbítsák nekik a szülőmetódusokat CancellationToken .

Szabály leírása

Ez a szabály az utolsó paraméterként használt CancellationToken metódusdefiníciókat elemzi, majd elemzi a törzsében meghívott összes metódust. Ha a metódushívások bármelyike elfogadhat egy CancellationToken utolsó paramétert, vagy olyan túlterheléssel rendelkezik, amely az utolsó paramétert veszi igénybe CancellationToken , akkor a szabály azt javasolja, hogy használja inkább ezt a beállítást, hogy a lemondási értesítés minden olyan műveletre propagálásra kerüljön, amely meghallgatható.

Megjegyzés:

A CA2016 szabály minden .NET-verzióban elérhető, ahol a CancellationToken típus elérhető. A vonatkozó verziókért tekintse meg a CancellationToken "Érvényes" szakaszát.

Szabálysértések kijavítása

A szabálysértéseket manuálisan is kijavíthatja, vagy használhatja a Visual Studióban elérhető kódjavítást. Vigye az egérmutatót a metódushívás mellett megjelenő villanykörte fölé, és válassza ki a javasolt módosítást.

Az alábbi példa két javasolt módosítást mutat be:

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

Ha nem aggódik a megszakított művelet értesítésének alacsonyabb metódushívásokra való továbbítása miatt, nyugodtan letilthatja a szabály megsértését. A C# (NothingVisual Basicben) None vagy a szabálysértés letiltására is lehetősége default van.

A szabály számos szabálysértést képes észlelni. Az alábbi példák azokat az eseteket mutatják be, amelyeket a szabály képes észlelni:

1. példa

A szabály azt javasolja, hogy továbbítsa a paramétert MyMethod a cMyMethodWithDefault meghívásnak, mert a metódus egy opcionális tokenparamétert határoz meg:

using System.Threading;

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

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

Erősít:

A paraméter továbbítása c :

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

Ha nem aggódik amiatt, hogy a lemondási értesítéseket alacsonyabb meghívásokra továbbítja, a következőkre van szüksége:

Explicit módon adja át default:

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

Vagy explicit módon adja át CancellationToken.None:

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

2. példa

A szabály azt javasolja, hogy továbbítsa a c paramétert MyMethod a MyMethodWithOverload meghívásnak, mert a metódus túlterheléssel rendelkezik, amely egy paramétert CancellationToken vesz igénybe:

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

Erősít:

A paraméter továbbítása c :

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

Ha nem aggódik amiatt, hogy a lemondási értesítéseket alacsonyabb meghívásokra továbbítja, a következőkre van szüksége:

Explicit módon adja át default:

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

Vagy explicit módon adja át CancellationToken.None:

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

Nem szabálysértési példák

A CancellationToken szülőmetódus paramétere nem az utolsó pozícióban van:

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

Az CancellationToken alapértelmezett metódus paramétere nem az utolsó helyen található:

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

A CancellationToken túlterhelési metódus paramétere nem az utolsó helyzetben van:

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

A szülőmetódus egynél több paramétert CancellationToken határoz meg:

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

Az alapértelmezett metódus egynél több paramétert CancellationToken határoz meg:

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 metódus túlterhelése több paramétert CancellationToken határoz meg:

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

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.