FileStream.Position viene aggiornato dopo il completamento di ReadAsync o WriteAsync
FileStream.Position viene ora aggiornato dopo il completamento di ReadAsync o WriteAsync.
Descrizione delle modifiche
Nelle versioni precedenti di .NET in Windows, FileStream.Position è stato aggiornato dopo l'avvio dell'operazione di lettura o scrittura asincrona. A partire da .NET 6, FileStream.Position viene aggiornato in modo ottimistico:
- Dopo l'avvio WriteAsync, ma se l'operazione non riesce o viene annullata, la posizione viene corretta.
- All'avvio di ReadAsync, ma se l'intero buffer non viene letto, la posizione viene corretta al termine dell'operazione.
Versione introdotta
.NET 6
Motivo della modifica
FileStream non è mai stato thread-safe, ma fino a .NET 6, .NET ha provato a supportare più chiamate simultanee ai relativi metodi asincroni (ReadAsync e WriteAsync) in Windows.
Questa modifica è stata introdotta per consentire l'I/O di file asincrono al 100% con FileStream e per risolvere i problemi seguenti:
- FileStream.FlushAsync finisce per eseguire scritture sincrone
- FileStream Win32 trasforma le letture asincrone in letture sincrone
Azione consigliata
Se ci si basa su FileStream.Position impostata prima dell'avvio della lettura o della scrittura perché il codice esegue parallele letture o scritture, è consigliabile passare all'uso dell'API System.IO.RandomAccess. L'API RandomAccess è progettata per le operazioni di file parallele.
Per abilitare il comportamento di .NET 5 in .NET 6, specificare un'opzione
AppContext
o una variabile di ambiente. Impostando l'opzione sutrue
, si rifiutano esplicitamente tutti i miglioramenti delle prestazioni apportati aFileStream
in .NET 6.{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
Importante
Questa opzione è disponibile solo in .NET 6. È stata rimossa in .NET 7.