File.ReadAllLinesAsync()
peut bloquer le fil de discussion de l'interface utilisateurLes 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>
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!