Maison > développement back-end > C++ > Pourquoi `File.ReadAllLinesAsync()` bloque-t-il le fil de discussion de l'interface utilisateur bien qu'il soit asynchrone ?

Pourquoi `File.ReadAllLinesAsync()` bloque-t-il le fil de discussion de l'interface utilisateur bien qu'il soit asynchrone ?

Linda Hamilton
Libérer: 2025-01-20 14:52:13
original
392 Les gens l'ont consulté

Why Does `File.ReadAllLinesAsync()` Block the UI Thread Despite Being Asynchronous?

Comprendre pourquoi File.ReadAllLinesAsync() peut bloquer le fil de discussion de l'interface utilisateur

Les méthodes asynchrones effectuent idéalement un travail synchrone minimal avant de renvoyer une tâche en attente. Cependant, File.ReadAllLinesAsync() ne suit pas toujours cette bonne pratique.

Le problème :

La méthode peut bloquer de manière inattendue le thread de l'interface utilisateur pendant une durée considérable avant que l'opération asynchrone ne commence réellement.

Idée fausse initiale :

On a initialement supposé que le blocage provenait de la nature intrinsèquement synchrone des opérations du système de fichiers. Les tests, cependant, ont montré que le thread se bloque avant tout accès au fichier.

Le vrai problème :

La mise en œuvre de File.ReadAllLinesAsync() n'embrasse pas pleinement les principes asynchrones. Il effectue une quantité importante de prétraitement synchrone avant de confier la tâche.

Solution recommandée :

Pour éviter le blocage des threads de l'interface utilisateur, utilisez la méthode synchrone File.ReadAllLines() enveloppée dans Task.Run() pour une exécution asynchrone :

<code class="language-csharp">var lines = await Task.Run(() => File.ReadAllLines(@"D:\temp.txt"));</code>
Copier après la connexion

Comparaison des performances :

Les tests utilisant un fichier de 6 Mo ont montré File.ReadAllLinesAsync() un blocage pendant environ 450 millisecondes avant de renvoyer une tâche incomplète (qui s'est ensuite terminée en 5 millisecondes). À l’inverse, la méthode synchrone, lorsqu’elle était exécutée de manière asynchrone via Task.Run(), présentait un retard négligeable.

.NET 6 et au-delà :

Bien que .NET 6 ait apporté des améliorations de performances à File.ReadAllLinesAsync(), il reste plus lent que l'approche synchrone lorsqu'il est utilisé de manière asynchrone et ne présente pas pleinement un véritable comportement asynchrone. Par conséquent, l'utilisation de Task.Run() avec la méthode synchrone reste l'approche suggérée pour une réactivité optimale 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal