Partager via


CA2008 : Ne pas créer de tâches sans passer TaskScheduler

Propriété Valeur
Identificateur de la règle CA2008
Titre Ne pas créer de tâches sans passer TaskScheduler
Catégorie Fiabilité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 10 Non

La cause

Une opération de création ou de continuation de tâche utilise une surcharge de méthode qui ne spécifie pas de paramètre TaskScheduler.

Description de la règle

Les méthodes de création et de continuation de tâches .NET suivantes ont des surcharges qui permettent de spécifier ou d’omettre une instance de TaskScheduler :

Spécifiez toujours un argument explicite TaskScheduler pour éviter la valeur par défaut Current , dont le comportement est défini par l’appelant et peut varier au moment de l’exécution. Current retourne le planificateur associé à tout ce qui Task est actuellement en cours d'exécution sur ce thread. S’il n’existe aucune tâche de ce type, elle retourne Default, qui représente le pool de threads. L'utilisation de Current peut entraîner des blocages ou des problèmes de réactivité de l'interface utilisateur dans certaines situations, alors qu'elle était destinée à créer la tâche dans le pool de threads, mais qu'elle attend au lieu de cela de revenir sur le thread de l'interface utilisateur.

Pour plus d’informations et des exemples détaillés, consultez Nouvelles options TaskCreationOptions et TaskContinuationOptions dans .NET Framework 4.5.

Comment corriger les violations

Pour corriger les violations, veuillez appeler la surcharge de méthode qui prend un TaskScheduler et transmettre explicitement Default ou Current afin de clarifier l'intention.

Example

// This code violates the rule.
var badTask = Task.Factory.StartNew(
    () =>
    {
        // ...
    }
);
badTask.ContinueWith(
    t =>
    {
        // ...
    }
);

// This code satisfies the rule.
var goodTask = Task.Factory.StartNew(
    () =>
    {
        // ...
    },
    CancellationToken.None,
    TaskCreationOptions.None,
    TaskScheduler.Default
);
goodTask.ContinueWith(
    t =>
    {
        // ...
    },
    CancellationToken.None,
    TaskContinuationOptions.None,
    TaskScheduler.Default
);

Quand supprimer les avertissements

Cet avertissement est principalement destiné aux bibliothèques, où le code peut être exécuté dans des environnements arbitraires et où le code ne doit pas faire d’hypothèses sur l’environnement ou sur la façon dont l’appelant de la méthode peut l’appeler ou l’attendre. Il peut être approprié de supprimer l’avertissement pour les projets qui représentent le code d’application plutôt que le code de bibliothèque.

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 CA2008
// The code that's violating the rule is on this line.
#pragma warning restore CA2008

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.CA2008.severity = none

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

Voir aussi