Share via


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:

  • 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 su true, si rifiutano esplicitamente tutti i miglioramenti delle prestazioni apportati a FileStream 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.

API interessate