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é | Value |
|---|---|
| Identificateur de la règle | CA2012 |
| Titre | Utiliser correctement ValueTasks |
| Catégorie | Fiabilité |
| Le correctif est cassant ou non cassant | Sans rupture |
| Activé par défaut dans .NET 10 | À titre de suggestion |
Cause
Une instance ValueTask retournée par un appel de membre est utilisée d’une manière susceptible d’entraîner des exceptions, des altérations ou des performances médiocres.
Description de la règle
Les instances ValueTask retournées par les appels de membres sont destinées à être directement attendues. Les tentatives d’utilisation d’une ValeurTask plusieurs fois ou d’accéder directement au résultat d’un utilisateur avant qu’il soit connu pour être terminé peuvent entraîner une exception ou une altération. Ignorer une telle ValeurTask est probablement une indication d’un bogue fonctionnel et peut dégrader les performances.
Comment corriger les violations
En général, les tâches ValueTasks doivent être directement attendues plutôt qu’ignorées ou stockées dans d’autres emplacements, tels que des variables ou des champs locaux.
Quand supprimer les avertissements
Pour les objets ValueTask retournés à partir d’appels de membres arbitraires, l’appelant doit partir du principe que le ValueTask doit être consommé (par exemple, attendu) une et une seule fois. Toutefois, si le développeur contrôle également le membre appelé et qu’il a une connaissance complète de son implémentation, il peut savoir qu’il est sans risque de supprimer l’avertissement, par exemple si le ValueTask de retour encapsule toujours un objet Task.
Example
public class NumberValueTask
{
public async ValueTask<int> GetNumberAsync()
{
await Task.Delay(100);
return 123;
}
public async Task UseValueTaskIncorrectlyAsync()
{
// This code violates the rule,
// because ValueTask is awaited multiple times
ValueTask<int> numberValueTask = GetNumberAsync();
int first = await numberValueTask;
int second = await numberValueTask; // <- illegal reuse
// ...
}
// This code satisfies the rule.
public async Task UseValueTaskCorrectlyAsync()
{
int first = await GetNumberAsync();
int second = await GetNumberAsync();
// ..
}
public async Task UseValueTaskAsTaskAsync()
{
ValueTask<int> numberValueTask = GetNumberAsync();
Task<int> numberTask = numberValueTask.AsTask();
int first = await numberTask;
int second = await numberTask;
// ...
}
}
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 CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
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.CA2012.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.