FileStream.Position 在 ReadAsync 或 WriteAsync 完成后更新

现在,FileStream.PositionReadAsyncWriteAsync 完成后更新。

更改说明

在 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 APIRandomAccess 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