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 | CA2012 |
| Titre | Utiliser correctement ValueTasks |
| Catégorie | Fiabilité |
| Le correctif a un effet disruptif ou non disruptif | Sans rupture |
| Activé par défaut dans .NET 10 | À titre de suggestion |
| Langues applicables | C# et Visual Basic |
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 ValueTask plusieurs fois ou d’accéder directement à son résultat avant qu'il ne soit confirmé comme 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 tenir pour acquis que le ValueTask doit être consommé (par exemple, en attente) une et une seule fois. Toutefois, si le développeur contrôle également le membre invoqué et qu'il a une connaissance complète de son implémentation, le développeur peut savoir qu'il est sûr de supprimer l'avertissement, par exemple, si la valeur de retour ValueTask 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.