Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
| 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 :
- Méthodes System.Threading.Tasks.TaskFactory.StartNew
- Méthodes System.Threading.Tasks.Task.ContinueWith
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.
Remarque
VSTHRD105 : Éviter les surcharges de méthode qui optent par défaut pour TaskScheduler.Current est une règle similaire implémentée dans le package Microsoft.VisualStudio.Threading.Analyzers.
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.