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


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