Condividi tramite


CA2024: Non usare StreamReader.EndOfStream nei metodi asincroni

Proprietà Valore
ID regola CA2024
titolo Non usare StreamReader.EndOfStream nei metodi asincroni
categoria affidabilità
Correzione causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 10 Come avviso

Causa

Una chiamata a StreamReader.EndOfStream viene eseguita all'interno di un metodo asincrono.

Descrizione regola

La proprietà StreamReader.EndOfStream può causare un blocco sincrono imprevisto quando nessun dato viene memorizzato nel buffer. Usare invece StreamReader.ReadLineAsync() direttamente, che restituisce null quando si raggiunge la fine del flusso.

Come correggere le violazioni

Per correggere una violazione, chiamare direttamente StreamReader.ReadLineAsync() e controllare il valore restituito per null.

Esempio

Il frammento di codice seguente mostra una violazione di CA2024:

public async Task Example(StreamReader streamReader)
{
    while (!streamReader.EndOfStream)
    {
        string? line = await streamReader.ReadLineAsync();
        // Do something with line.
    }
}
Public Async Function Example(streamReader As StreamReader) As Task
    While Not streamReader.EndOfStream
        Dim line As String = Await streamReader.ReadLineAsync()
        ' Do something with line.
    End While
End Function

Il frammento di codice seguente corregge la violazione:

public async Task Example(StreamReader streamReader)
{
    string? line;
    while ((line = await streamReader.ReadLineAsync()) is not null)
    {
        // Do something with line.
    }
}
Public Async Function Example(streamReader As StreamReader) As Task
    Dim line As String = Await streamReader.ReadLineAsync()
    While line IsNot Nothing
        ' Do something with line.
        line = Await streamReader.ReadLineAsync()
    End While
End Function

Quando eliminare gli avvisi

Non è consigliabile eliminare gli avvisi da questa regola, perché l'app potrebbe bloccarsi se non vengono risolte le violazioni.

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 CA2024
// The code that's violating the rule is on this line.
#pragma warning restore CA2024

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

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

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