Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| 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:
              
              
            
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# (defaultin Visual Basic) doorgeven Nothing 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 ct 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 ct)
        {
            MyMethodWithDefault();
        }
    }
}
Oplossing:
              ct De parameter doorsturen:
public static void MyMethod(CancellationToken ct)
{
    MyMethodWithDefault(ct);
}
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 ct)
{
    MyMethodWithDefault(default);
}
Of expliciet doorgeven CancellationToken.None:
public static void MyMethod(CancellationToken ct)
{
    MyMethodWithDefault(CancellationToken.None);
}
Voorbeeld 2
De regel stelt voor om de ct 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 ct)
        {
            MyMethodWithOverload();
        }
    }
}
Oplossing:
              ct De parameter doorsturen:
public static void MyMethod(CancellationToken ct)
{
    MyMethodWithOverload(ct);
}
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 ct)
{
    MyMethodWithOverload(default);
}
Of expliciet doorgeven CancellationToken.None:
public static void MyMethod(CancellationToken ct)
{
    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 ct, 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 ct)
        {
            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 ct)
        {
            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 ct1, CancellationToken ct2)
        {
            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 ct1 = default, CancellationToken ct2 = default)
        {
        }
        public static void MyMethod(CancellationToken ct)
        {
            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 ct1, CancellationToken ct2)
        {
        }
        public static void MyMethodWithOverload()
        {
        }
        public static void MyMethod(CancellationToken ct)
        {
            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.