Les E/S de fichiers asynchrones bloquent le thread de l'interface utilisateur dans .NET : analyse des causes
La méthodeFile.ReadAllLinesAsync()
est conçue pour fournir un accès asynchrone aux fichiers, permettant à l'application d'interface utilisateur d'effectuer des opérations sur les fichiers en arrière-plan tout en maintenant un fonctionnement fluide. Cependant, comme le montre l’exemple de code, cette méthode bloque de manière inattendue le thread de l’interface utilisateur.
La raison de ce comportement est une mise en œuvre incohérente des recommandations de Microsoft pour la conception de méthodes asynchrones. File.ReadAllLinesAsync()
Viole le principe du renvoi d'une tâche incomplète après un travail de synchronisation minimal, et bloque à la place le thread pendant une longue période avant de revenir.
Résultats expérimentaux et optimisation
Les tests de performances montrent que File.ReadAllLinesAsync()
peut bloquer le thread actuel pendant des centaines de millisecondes, affectant sérieusement la réactivité de l'interface utilisateur. Ce comportement est cohérent dans toutes les configurations matérielles.
En guise de solution de contournement, il est recommandé d'éviter d'utiliser l'API du système de fichiers asynchrone dans les applications GUI. Au lieu de cela, les API synchrones doivent être encapsulées dans Task.Run
pour maintenir une exécution asynchrone sans bloquer les threads.
Améliorations de .NET 6
Bien que les API du système de fichiers asynchrones aient été améliorées dans .NET 6, elles ne sont toujours pas entièrement asynchrones et sont en retard par rapport aux API synchrones. Par conséquent, l’encapsulation des API synchrones dans Task.Run
reste l’approche recommandée pour des performances optimales de l’interface utilisateur.
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!