Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| Propriété | Valeur |
|---|---|
| Identificateur de la règle | CA2007 |
| Titre | N’attendez pas directement une tâche |
| Catégorie | Fiabilité |
| Le correctif a un effet disruptif ou non disruptif | Sans rupture |
| Activé par défaut dans .NET 10 | Non |
| Langues applicables | C# et Visual Basic |
Cause
Une méthode asynchrone attend une Task directement.
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.
Appeler
ConfigureAwait(true)sur la tâche a le même comportement que ne pas appeler 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. Utiliserfalseest une bonne option pour les bibliothèques indépendantes de toute 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 dans le contexte d’origine ou où il n'y a pas de contexte en place. Par exemple, lors de l'écriture de code dans un gestionnaire d'événements de clic sur bouton dans une application WinForms ou WPF, en général, la suite d'une opération en attente doit s'exécuter sur le thread de l'interface utilisateur, et par conséquent, le comportement par défaut de planification de la suite 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