次の方法で共有


CA2024: 非同期メソッドで StreamReader.EndOfStream を使用しない

財産 価値
ルール ID 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

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、その重大度を 構成ファイルnone に設定します。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。