Delen via


CA2016: de parameter CancellationToken doorsturen naar methoden die één methode gebruiken

Eigenschappen Weergegeven als
Typenaam ForwardCancellationTokenToInvocations
Regel-id CA2016
Titel De parameter CancellationToken doorsturen naar methoden die er één gebruiken
Categorie Betrouwbaarheid
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Als suggestie

Oorzaak

Met deze regel worden methode-aanroepen gevonden die een CancellationToken parameter kunnen accepteren, maar die geen parameter doorgeven, en wordt voorgesteld om de bovenliggende methode CancellationToken naar hen door te sturen.

Beschrijving van regel

Deze regel analyseert methodedefinities die een CancellationToken als laatste parameter gebruiken en analyseert vervolgens alle methoden die in de hoofdtekst worden aangeroepen. Als een van de methodeaanroepen een CancellationToken als laatste parameter kan accepteren of een overbelasting heeft die als CancellationToken laatste parameter wordt gebruikt, stelt de regel voor dat deze optie wordt gebruikt om ervoor te zorgen dat de annuleringsmelding wordt doorgegeven aan alle bewerkingen die ernaar kunnen luisteren.

Notitie

Regel CA2016 is beschikbaar in alle .NET-versies waar het CancellationToken type beschikbaar is. Zie de sectie CancellationToken 'Van toepassing op' voor de toepasselijke versies.

Schendingen oplossen

U kunt schendingen handmatig oplossen of de codeoplossing gebruiken die beschikbaar is in Visual Studio. Beweeg de muisaanwijzer over de gloeilamp die naast de aanroep van de methode wordt weergegeven en selecteer de voorgestelde wijziging.

In het volgende voorbeeld ziet u twee voorgestelde wijzigingen:

Regel CA2016: de parameter CancellationToken doorsturen naar methoden die één gebruiken

Het is veilig om een schending van deze regel te onderdrukken als u zich geen zorgen maakt over het doorsturen van de melding voor geannuleerde bewerkingen naar lagere methode aanroepen. U kunt ook expliciet C# (Nothingin Visual Basic) doorgeven default of None de regelschending onderdrukken.

De regel kan verschillende schendingen detecteren. In de volgende voorbeelden ziet u gevallen die door de regel kunnen worden gedetecteerd:

Voorbeeld 1

De regel stelt voor om de c parameter door te sturen naar MyMethod de MyMethodWithDefault aanroep, omdat de methode een optionele tokenparameter definieert:

using System.Threading;

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

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

Oplossing:

c De parameter doorsturen:

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

Als u zich geen zorgen maakt over het doorsturen van annuleringsmeldingen naar lagere aanroepen, kunt u het volgende doen:

Expliciet doorgeven default:

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

Of expliciet doorgeven CancellationToken.None:

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

Voorbeeld 2

De regel stelt voor om de c parameter van MyMethod naar de MyMethodWithOverload aanroep door te sturen, omdat de methode een overbelasting heeft die een CancellationToken parameter gebruikt:

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

Oplossing:

c De parameter doorsturen:

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

Als u zich geen zorgen maakt over het doorsturen van annuleringsmeldingen naar lagere aanroepen, kunt u het volgende doen:

Expliciet doorgeven default:

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

Of expliciet doorgeven CancellationToken.None:

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

Voorbeelden van niet-schending

De CancellationToken parameter in de bovenliggende methode bevindt zich niet op de laatste positie:

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

De CancellationToken parameter in de standaardmethode bevindt zich niet op de laatste positie:

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

De CancellationToken parameter in de overbelastingsmethode bevindt zich niet op de laatste positie:

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

De bovenliggende methode definieert meer dan één CancellationToken parameter:

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

De methode met standaardwaarden definieert meer dan één CancellationToken parameter:

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

De overbelasting van de methode definieert meer dan één CancellationToken parameter:

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

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.