Freigeben über


FileStream.Position-Aktualisierung nach Abschluss von ReadAsync oder WriteAsync

FileStream.Position wird nun nach Abschluss von ReadAsync oder WriteAsync aktualisiert.

Beschreibung der Änderung:

In früheren .NET-Versionen unter Windows wurde FileStream.Position nach Beginn der asynchronen Lese- oder Schreibvorgänge aktualisiert. Ab .NET 6 wird FileStream.Position optimistisch aktualisiert:

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

Eingeführt in Version

.NET 6

Grund für die Änderung

FileStream war noch nie threadsicher, bis .NET 6 versuchte .NET jedoch, mehrere gleichzeitige Aufrufe für die 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 FileStream.Position festlegen, bevor der Lese- oder Schreibvorgang gestartet wird, da Ihr Code parallele Lese- oder Schreibvorgänge ausführt, sollten Sie stattdessen zur Verwendung der System.IO.RandomAccess-API wechseln. Die RandomAccess-API wurde für parallele Dateivorgänge entwickelt.

  • Zum Aktivieren des .NET 5-Verhaltens in .NET 6 geben Sie einen AppContext-Parameter oder eine Umgebungsvariable an. Indem Sie den Parameter auf true festlegen, können Sie alle Leistungsverbesserungen in .NET 6 deaktivieren, die an FileStream vorgenommen wurden.

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

    Wichtig

    Diese Option ist nur in .NET 6 verfügbar. Sie wurde in .NET 7 entfernt.

Betroffene APIs