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:
- FileStream.FlushAsync führt synchrone Schreibvorgänge aus
- Win32 FileStream ändert asynchrone Lesevorgänge in synchrone Lesevorgänge
Empfohlene Maßnahme
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 auftrue
festlegen, können Sie alle Leistungsverbesserungen in .NET 6 deaktivieren, die anFileStream
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.