CA2016 : Transférer le paramètre CancellationToken aux méthodes qui l’acceptent

Propriété Valeur
Nom du type ForwardCancellationTokenToInvocations
Identificateur de la règle CA2016
Titre Transférer le paramètre CancellationToken aux méthodes qui l’acceptent
Catégorie Fiabilité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 À titre de suggestion

Cause

Cette règle localise les appels de méthode qui peuvent accepter un paramètre CancellationToken, mais qui ne les transmettent pas, et suggère de leur transférer le CancellationToken de la méthode parente.

Description de la règle

Cette règle analyse les définitions de méthode qui acceptent un CancellationToken comme dernier paramètre, puis analyse toutes les méthodes appelées dans son corps. Si l’un des appels de méthode peut accepter un CancellationToken comme dernier paramètre ou avoir une surcharge qui prend un CancellationToken comme dernier paramètre, la règle suggère d’utiliser plutôt cette option afin de s’assurer que la notification d’annulation est propagée à toutes les opérations qui peuvent l’écouter.

Notes

La règle CA2016 est disponible dans toutes les versions de .NET où le type CancellationToken est disponible. Pour connaître les versions applicables, consultez la section « S’applique à » de CancellationToken.

Comment corriger les violations

Vous pouvez corriger les violations manuellement ou utiliser le correctif de code disponible dans Visual Studio. Pointez sur l’ampoule qui apparaît en regard de l’appel de méthode et sélectionnez la modification suggérée.

L’exemple suivant montre deux suggestions de modification :

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

Vous pouvez supprimer sans risque une violation de cette règle si vous n’êtes pas préoccupé par le transfert de la notification d’opération annulée à des appels de méthode inférieurs. Vous pouvez également passer default explicitement en C# (Nothing en Visual Basic) ou None pour supprimer la violation de règle.

La règle peut détecter diverses violations. Les exemples suivants illustrent les cas que la règle peut détecter :

Exemple 1

La règle suggère de transférer le paramètre c de MyMethod vers l’appel MyMethodWithDefault, car la méthode définit un paramètre de jeton facultatif :

using System.Threading;

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

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

Correctif :

Transférez le paramètre c :

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

Si vous n’êtes pas préoccupé par le transfert des notifications d’annulation vers des appels inférieurs, vous pouvez :

Passer explicitement default :

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

Ou passer explicitement CancellationToken.None :

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

Exemple 2

La règle suggère de transférer le paramètre c de MyMethod à l’appel MyMethodWithOverload, car la méthode a une surcharge qui prend un paramètre CancellationToken :

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

Correctif :

Transférez le paramètre c :

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

Si vous n’êtes pas préoccupé par le transfert des notifications d’annulation vers des appels inférieurs, vous pouvez :

Passer explicitement default :

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

Ou passer explicitement CancellationToken.None :

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

Exemples de non-violation

Le paramètre CancellationToken dans la méthode parente n’est pas à la dernière position :

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

Le paramètre CancellationToken dans la méthode par défaut n’est pas à la dernière position :

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

Le paramètre CancellationToken dans la méthode de surcharge n’est pas à la dernière position :

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

La méthode parente définit plusieurs paramètres CancellationToken :

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

La méthode avec des valeurs par défaut définit plusieurs paramètres CancellationToken :

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

La surcharge de méthode définit plusieurs paramètres CancellationToken :

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

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.