ReadAsync または WriteAsync の完了後に FileStream.Position が更新される
ReadAsync または WriteAsync の完了後に FileStream.Position が更新されるようになりました。
変更内容
Windows 上の以前の .NET バージョンの場合、非同期の読み取りまたは書き込み操作の開始後に FileStream.Position が更新されていました。 .NET 6 以降では、FileStream.Position は楽観的に更新されるようになりました。
- WriteAsync 開始後、操作が失敗またはキャンセルされた場合、位置が修正されます。
- ReadAsync 開始時にバッファー全体が読み取られていない場合は、操作完了後に位置が修正されます。
導入されたバージョン
.NET 6
変更理由
FileStream はスレッドセーフではありませんが、.NET 6 までは、Windows 上の非同期メソッド (ReadAsync と WriteAsync) に対する複数の同時呼び出しのサポートが試みられていました。
この変更は、FileStream による 100% 非同期のファイル I/O を許可し、次の問題を修正するために導入されました。
推奨される操作
コードが並列読み取りまたは書き込みを実行するため、読み取りまたは書き込みを開始する前に FileStream.Position が設定されることに依存している場合は、代わりに System.IO.RandomAccess API を使用するように切り替える必要があります。 この RandomAccess API は、並列ファイル操作用に設計されています。
.NET 6 で .NET 5 の動作を有効にするには、
AppContext
スイッチまたは環境変数を指定します。 スイッチをtrue
に設定すると、.NET 6 でFileStream
に対して行われたすべてのパフォーマンス向上策が無効になります。{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
重要
このスイッチは .NET 6 でのみ使用できます。 .NET 7 では削除されました。
影響を受ける API
.NET