Udostępnij za pośrednictwem


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:

  • 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 na true, zrezygnujesz ze wszystkich ulepszeń wydajności w FileStream 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.

Dotyczy interfejsów API