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. Passer false 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

Voir aussi