Bien que File.ReadAllLinesAsync()
dans .NET (versions 3.1 et ultérieures) vise un comportement non bloquant, il peut étonnamment bloquer le thread de l'interface utilisateur dans des conditions spécifiques.
Dans les applications WPF, l'utilisation de File.ReadAllLinesAsync()
peut geler l'interface utilisateur. Cela provient d'incohérences dans la manière dont les API d'accès aux fichiers asynchrones sont implémentées. Les directives de Microsoft suggèrent que les méthodes asynchrones doivent renvoyer un Task
après un travail synchrone minimal. File.ReadAllLinesAsync()
s'en écarte, conduisant à un blocage prolongé avant de renvoyer un Task
incomplet.
La solution de contournement recommandée consiste à utiliser la méthode File.ReadAllLines()
synchrone dans Task.Run()
. Cela décharge la lecture du fichier vers un thread d'arrière-plan, empêchant ainsi le gel de l'interface utilisateur.
Les tests de lecture d'un fichier de 6 Mo avec File.ReadAllLinesAsync()
ont révélé un blocage important de l'interface utilisateur d'environ 450 millisecondes – un écart évident par rapport au comportement asynchrone attendu.
Même avec des améliorations dans les E/S de fichiers asynchrones de .NET 6, File.ReadAllLinesAsync()
conserve des limitations de performances. Il est considérablement plus lent (environ le double du temps) que son homologue synchrone et n'est pas entièrement asynchrone. Par conséquent, l'utilisation de la version synchrone dans Task.Run()
reste la meilleure pratique jusqu'à ce que d'autres optimisations de l'API soient mises en œuvre.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!