Freigeben über


FileStream.Position-Aktualisierung nach Abschluss von ReadAsync oder WriteAsync

FileStream.Position wird jetzt aktualisiert, nachdem ReadAsync oder WriteAsync abgeschlossen ist.

Änderungsbeschreibung

In früheren Versionen von .NET unter Windows wurde FileStream.Position nach Start des asynchronen Lese- oder Schreibvorgangs aktualisiert. Ab .NET 6 FileStream.Position wird optimistisch aktualisiert:

  • Nachdem WriteAsync gestartet wurde, aber wenn der Vorgang fehlschlägt oder abgebrochen wird, wird die Position korrigiert.
  • Wenn ReadAsync gestartet wird, aber der gesamte Puffer nicht gelesen wird, wird die Position nach Abschluss des Vorgangs korrigiert.

Eingeführte Version

.NET 6

Grund für Änderung

FileStream war nie threadsicher, aber bis .NET 6 hat .NET versucht, mehrere gleichzeitige Aufrufe seiner asynchronen Methoden (ReadAsync und WriteAsync) unter Windows zu unterstützen.

Diese Änderung wurde eingeführt, um einen zu 100 Prozent asynchronen Datei-E/A mit FileStream zu ermöglichen und die folgenden Probleme zu beheben:

  • Wenn Sie darauf angewiesen sind, dass FileStream.Position vor dem Beginn des Lese- oder Schreibvorgangs festgelegt wird, weil Ihr Code parallele Lese- oder Schreibvorgänge ausführt, sollten Sie stattdessen auf die Verwendung der System.IO.RandomAccess API umstellen. Die RandomAccess API wurde für parallele Dateivorgänge entwickelt.

  • Um das .NET 5-Verhalten in .NET 6 zu aktivieren, geben Sie einen AppContext Switch oder eine Umgebungsvariable an. Durch das Festlegen der Option auf true deaktivieren Sie alle Leistungsverbesserungen, die in FileStream in .NET 6 vorgenommen wurden.

    {
        "configProperties": {
            "System.IO.UseNet5CompatFileStream": true
        }
    }
    
    set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
    

    Von Bedeutung

    Dieser Switch ist nur in .NET 6 verfügbar. Sie wurde in .NET 7 entfernt.

Betroffene APIs