Поделиться через


CA2024: не используйте StreamReader.EndOfStream в асинхронных методах

Свойство Ценность
идентификатор правила CA2024
заголовок Не используйте StreamReader.EndOfStream в асинхронных методах
категории надежности
исправление является критическим или неразрывным Неразрывная
включен по умолчанию в .NET 10 Как предупреждение

Причина

Вызов StreamReader.EndOfStream выполняется внутри асинхронного метода.

Описание правила

Свойство StreamReader.EndOfStream может вызвать непреднамеренные синхронные блокировки, если данные не буферизованы. Вместо этого используйте StreamReader.ReadLineAsync() напрямую, который возвращает null при достижении конца потока.

Устранение нарушений

Чтобы устранить нарушение, напрямую вызовите StreamReader.ReadLineAsync() и проверьте возвращаемое значение для null.

Пример

В следующем фрагменте кода показано нарушение 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

Следующий фрагмент кода исправляет нарушение.

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

При подавлении предупреждений

Вы не должны подавлять предупреждения из этого правила, так как приложение может зависать, если вы не исправите нарушения.

Подавление предупреждения

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность в файле конфигурации.

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

Дополнительные сведения см. в статье Подавление предупреждений анализа кода.