次の方法で共有


ReadAsync または WriteAsync が完了した後の FileStream.Position の更新

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

変更の説明

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

  • WriteAsyncが開始された後、操作が失敗した場合、または取り消された場合、位置は修正されます。
  • ReadAsync開始したが、バッファー全体が読み取られない場合、操作の完了後に位置が修正されます。

導入されたバージョン

.NET 6

変更の理由

FileStream はスレッド セーフではありませんでしたが、.NET 6 まで、.NET は 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
    

    Von Bedeutung

    このスイッチは、.NET 6 でのみ使用できます。 .NET 7 で削除されました。

影響を受ける API