CA2007 : N’attendez pas directement une Tâche
Propriété | Value |
---|---|
Identificateur de la règle | CA2007 |
Titre | N’attendez pas directement une Tâche |
Catégorie | Fiabilité |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | Non |
Cause
Une méthode asynchrone attend une Task directe.
Description de la règle
Lorsqu’une méthode asynchrone attend une Task directement, la continuation se produit généralement dans le même thread que celui qui a créé la tâche, en fonction du contexte asynchrone. Ce comportement peut être coûteux en termes de performances et peut entraîner un blocage sur le thread d’interface utilisateur. Envisagez d’appeler Task.ConfigureAwait(Boolean) pour signaler votre intention de continuer.
Comment corriger les violations
Pour corriger les violations, appelez ConfigureAwait sur le Task attendu. Vous pouvez passer true
ou false
pour le paramètre continueOnCapturedContext
.
L’appel
ConfigureAwait(true)
sur la tâche a le même comportement que celui qui n’appelle pas explicitement ConfigureAwait. En appelant explicitement cette méthode, vous indiquez aux lecteurs que vous souhaitez effectuer intentionnellement la continuation sur le contexte de synchronisation d’origine.Appelez
ConfigureAwait(false)
sur la tâche pour planifier des continuations vers le pool de threads, ce qui évite un blocage sur le thread d’interface utilisateur. Passerfalse
est une bonne option pour les bibliothèques indépendantes de l’application.
Exemple
L’extrait de code suivant génère l’avertissement :
public async Task Execute()
{
Task task = null;
await task;
}
Pour corriger la violation, appelez ConfigureAwait sur le Task attendu :
public async Task Execute()
{
Task task = null;
await task.ConfigureAwait(false);
}
Quand supprimer les avertissements
Cet avertissement est destiné aux bibliothèques, où le code peut être exécuté dans des environnements arbitraires et où il 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 est généralement approprié de supprimer entièrement l’avertissement pour les projets qui représentent du code d’application plutôt que du code de bibliothèque. En fait, l’exécution de cet analyseur sur le code d’application (par exemple, les gestionnaires d’événements Click du bouton dans un projet WinForms ou WPF) risque d’entraîner des actions incorrectes.
Vous pouvez supprimer cet avertissement dans n’importe quelle situation où la continuation doit être planifiée vers le contexte d’origine ou un emplacement dans lequel il n’existe aucun contexte de ce style en place. Par exemple, lors de l’écriture de code dans un gestionnaire d’événements Click du bouton dans une application WinForms ou WPF, en général, la continuation d’une attente doit s’exécuter sur le thread d’interface utilisateur, et par conséquent, le comportement par défaut de la planification de la continuation vers le contexte d’origine est souhaitable. Comme autre exemple, lors de l’écriture de code dans une application ASP.NET Core, par défaut, il n’y a pas de SynchronizationContext ou TaskScheduler. C’est la raison pour laquelle un ConfigureAwait
ne modifie pas réellement de comportement.
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 CA2007
// The code that's violating the rule is on this line.
#pragma warning restore CA2007
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.CA2007.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Configurer le code à analyser
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer toutes ces options pour cette règle uniquement, pour toutes les règles auxquelles elles s’appliquent ou pour toutes les règles de cette catégorie (Fiabilité) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Exclure les méthodes async void
Vous pouvez configurer si vous souhaitez exclure des méthodes asynchrones qui ne retournent pas de valeur de cette règle. Pour exclure ces types de méthodes, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
# Package version 2.9.0 and later
dotnet_code_quality.CA2007.exclude_async_void_methods = true
# Package version 2.6.3 and earlier
dotnet_code_quality.CA2007.skip_async_void_methods = true
Type de sortie
Vous pouvez également configurer les types d’assemblies de sortie auxquels appliquer cette règle. Par exemple, pour appliquer cette règle uniquement au code qui produit une application console ou une bibliothèque liée dynamiquement (autrement dit, pas une application d’interface utilisateur), ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary