Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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.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.