Поделиться через


FileStream.Position обновляется после завершения ReadAsync или WriteAsync

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.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.

Затронутые API