CA2012 : Utiliser correctement ValueTasks

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.

Voir aussi