Aktualizacje FileStream.Position po zakończeniu operacji ReadAsync lub WriteAsync
FileStream.Position jest teraz aktualizowany po ReadAsync zakończeniu lub WriteAsync zakończeniu.
Opis zmiany
W poprzednich wersjach platformy .NET w systemie Windows FileStream.Position została zaktualizowana po rozpoczęciu asynchronicznej operacji odczytu lub zapisu. Począwszy od platformy .NET 6, FileStream.Position jest aktualizowany optymistycznie:
- Po WriteAsync uruchomieniu, ale jeśli operacja zakończy się niepowodzeniem lub zostanie anulowana, pozycja zostanie poprawiona.
- Po ReadAsync uruchomieniu, ale jeśli cały bufor nie zostanie odczytany, pozycja zostanie poprawiona po zakończeniu operacji.
Wprowadzona wersja
.NET 6
Przyczyna wprowadzenia zmiany
FileStream nigdy nie był bezpieczny wątkowo, ale dopóki platforma .NET 6 nie próbowała obsługiwać wielu współbieżnych wywołań do metod asynchronicznych (ReadAsync i WriteAsync) w systemie Windows.
Ta zmiana została wprowadzona w celu umożliwienia 100% asynchronicznego we/ FileStream wy pliku i rozwiązania następujących problemów:
- FileStream.FlushAsync kończy się wykonywaniem synchronicznych zapisów
- Usługa FileStream Win32 zamienia asynchroniczne odczyty w operacje odczytu synchronizacji
Zalecana akcja
Jeśli polegasz na FileStream.Position ustawieniu przed rozpoczęciem odczytu lub zapisu, ponieważ kod wykonuje równoległe operacje odczytu lub zapisu, należy przełączyć się, aby zamiast tego używać interfejsu System.IO.RandomAccess API. Interfejs RandomAccess API jest przeznaczony do równoległych operacji na plikach.
Aby włączyć zachowanie platformy .NET 5 na platformie .NET 6, określ
AppContext
przełącznik lub zmienną środowiskową. Ustawiając przełącznik natrue
, zrezygnujesz ze wszystkich ulepszeń wydajności wFileStream
programie .NET 6.{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
Ważne
Ten przełącznik jest dostępny tylko na platformie .NET 6. Został on usunięty na platformie .NET 7.