次の方法で共有


ReadAsync または WriteAsync の完了後に FileStream.Position が更新される

ReadAsync または WriteAsync の完了後に FileStream.Position が更新されるようになりました。

変更内容

Windows 上の以前の .NET バージョンの場合、非同期の読み取りまたは書き込み操作の開始後に FileStream.Position が更新されていました。 .NET 6 以降では、FileStream.Position は楽観的に更新されるようになりました。

  • WriteAsync 開始後、操作が失敗またはキャンセルされた場合、位置が修正されます。
  • ReadAsync 開始時にバッファー全体が読み取られていない場合は、操作完了後に位置が修正されます。

導入されたバージョン

.NET 6

変更理由

FileStream はスレッドセーフではありませんが、.NET 6 までは、Windows 上の非同期メソッド (ReadAsyncWriteAsync) に対する複数の同時呼び出しのサポートが試みられていました。

この変更は、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