Partager via


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 :

  • 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 sur true, 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.

API affectées