Mises à jour de FileStream.Position après la finalisation de ReadAsync ou de WriteAsync
FileStream.Position est maintenant mis à jour une fois que ReadAsync ou WriteAsync a terminé.
Description de la modification
Dans les versions précédentes de .NET sur Windows, FileStream.Position était mis à jour après le démarrage de l’opération de lecture ou d’écriture asynchrone. À compter de .NET 6, FileStream.Position est mis à jour de façon optimiste :
- Après le démarrage de WriteAsync, mais si l’opération échoue ou est annulée, la position est corrigée.
- Au démarrage de ReadAsync, mais si la mémoire tampon entière n’est pas lue, la position est corrigée une fois l’opération terminée.
Version introduite
.NET 6
Raison du changement
FileStream n’a jamais été thread-safe, mais jusqu’à .NET 6, .NET essayait de prendre en charge plusieurs appels simultanés à ses méthodes asynchrones (ReadAsync et WriteAsync) sur Windows.
Cette modification a été introduite pour autoriser les E/S de fichier 100 % asynchrones avec FileStream et pour résoudre les problèmes suivants :
- FileStream.FlushAsync finit par effectuer des écritures synchrones
- Win32 FileStream transforme les lectures asynchrones en lectures de synchronisation
Action recommandée
Si vous vous appuyez sur la définition de FileStream.Position avant le démarrage de la lecture ou de l’écriture, car votre code effectue des lectures ou des écritures parallèles, vous devez basculer pour utiliser l’API System.IO.RandomAccess à la place. L’API RandomAccess est conçue pour les opérations de fichier parallèles.
Pour activer le comportement .NET 5 dans .NET 6, spécifiez un commutateur
AppContext
ou une variable d’environnement. En définissant le commutateur surtrue
, vous désactivez toutes les améliorations du niveau de performance apportées àFileStream
dans .NET 6.{ "configProperties": { "System.IO.UseNet5CompatFileStream": true } }
set DOTNET_SYSTEM_IO_USENET5COMPATFILESTREAM=1
Important
Ce commutateur est disponible uniquement dans .NET 6. Il a été supprimé dans .NET 7.