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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET