Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
FileStream.Position теперь обновляется после завершения ReadAsync или WriteAsync.
Описание изменения
В предыдущих версиях .NET в Windows FileStream.Position после запуска асинхронной операции чтения или записи. Начиная с .NET 6, FileStream.Position оптимистично обновляется:
- После WriteAsync запуска, но если операция завершается сбоем или отменена, позиция исправляется.
- При ReadAsync запуске, но если весь буфер не считывается, позиция исправляется после завершения операции.
Представленные версии
.NET 6
Причина изменения
FileStream не является потокобезопасным, но до .NET 6 платформа .NET пыталась поддерживать несколько одновременных вызовов к его асинхронным методам (ReadAsync и WriteAsync) в Windows.
Это изменение было введено для предоставления 100 % асинхронного ввода-вывода файла с помощью FileStream и для устранения следующих проблем:
- FileStream.FlushAsync завершается синхронной записью
- Win32 FileStream превращает асинхронные операции чтения в синхронные операции чтения
Рекомендуемое действие
Если вы полагаетесь на FileStream.Position настройку перед началом чтения или записи, так как код выполняет параллельные операции чтения или записи, следует переключиться на использование System.IO.RandomAccess API. RandomAccess API предназначен для параллельных операций с файлами.
Чтобы включить поведение .NET 5 в .NET 6, укажите параметр
AppContext
или переменную среды. Установив для параметра значениеtrue
, вы отказываетесь от всех улучшений производительности, имеющихсяFileStream
в .NET 6.{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
Внимание
Этот параметр доступен только в .NET 6. Он был удален в .NET 7.