现在,FileStream.Position 在 ReadAsync 或 WriteAsync 完成后更新。
更改描述
在 Windows 上的早期 .NET 版本中, FileStream.Position 在异步读取或写入作启动后进行了更新。 从 .NET 6 开始,FileStream.Position 被乐观地更新:
- 在 WriteAsync 启动后,如果操作失败或取消,则位置将被更正。
- ReadAsync 启动时,但如果未读取整个缓冲区,则操作完成后会更正位置。
已引入的版本
.NET 6
更改原因
FileStream 从未线程安全,但直到 .NET 6,.NET 才尝试在 Windows 上支持对其异步方法(ReadAsync 和 WriteAsync)的多个并发调用。
引入此更改是为了允许通过 FileStream 进行 100% 异步文件 I/O,并修复以下问题:
建议的措施
如果由于代码执行并行读取或写入,而依赖于在读取或写入开始前设置的 FileStream.Position,则应改用 APISystem.IO.RandomAccess。 该 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 中已移除。