Condividi tramite


CA2012: Usare Correttamente ValueTasks

Proprietà valore
ID regola CA2012
Title Usare correttamente gli elementi ValueTask
Categoria Affidabilità
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitato per impostazione predefinita in .NET 10 Come suggerimento

Causa

Un'istanza ValueTask restituita da una chiamata a un membro viene usata in modo da causare eccezioni, danneggiamento o prestazioni scarse.

Descrizione regola

ValueTask Le istanze restituite dalle chiamate ai membri devono essere attese direttamente. I tentativi di utilizzare un valore ValueTask più volte o di accedere direttamente al risultato di uno prima che sia noto che venga completato possono causare un'eccezione o un danneggiamento. Ignorare tale ValueTask è probabilmente un'indicazione di un bug funzionale e può compromettere le prestazioni.

Come correggere le violazioni

In generale, ValueTasks deve essere atteso direttamente anziché scartato o archiviato in altre posizioni, ad esempio variabili locali o campi.

Quando eliminare gli avvisi

Per ValueTask gli oggetti restituiti da chiamate di membri arbitrari, il chiamante deve presupporre che l'oggetto ValueTask deve essere utilizzato (ad esempio, atteso) una sola volta e una sola volta. Tuttavia, se lo sviluppatore controlla anche il membro richiamato e ha una conoscenza completa dell'implementazione, lo sviluppatore potrebbe sapere che è sicuro eliminare l'avviso, ad esempio se il ritorno ValueTask esegue sempre il wrapping di un Task oggetto.

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;

        // ...
    }
}

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche