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
Дополнительные сведения см. в статье Подавление предупреждений анализа кода.