await Task.Run
dans les méthodes asynchrones : nécessaires ou pas ?L'utilisation de await Task.Run
dans les méthodes asynchrones est souvent source de confusion. Clarifions cela avec un exemple :
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
par rapport à :
<code class="language-csharp">await LongProcess();</code>
où LongProcess
est une méthode asynchrone contenant plusieurs appels asynchrones (par exemple, DbDataReader.ExecuteReaderAsync()
).
La différence clé :
Dans ce cas, await Task.Run
est redondant. Cela introduit une tâche supplémentaire inutile au sein d’une méthode déjà asynchrone. Les méthodes asynchrones exploitent déjà la concurrence via le pool de threads. L'ajout de Task.Run
crée une surcharge inutile.
Explication :
Async/await facilite l'exécution de code non bloquant. Le thread continue de traiter d'autres tâches en attendant la fin d'une opération asynchrone. Lorsqu’une méthode asynchrone est appelée, le thread n’est pas bloqué ; le mot clé await
permet au thread de reprendre l'exécution une fois l'opération terminée.
Considérations importantes :
await
et reprend lorsque la tâche attendue est terminée. Bien que le changement de contexte puisse impliquer différents threads sous le capot, le flux logique reste en grande partie monothread.Task.Run
est bénéfique. Le déchargement du calcul vers un thread d'arrière-plan évite de bloquer le thread principal de l'interface utilisateur, garantissant ainsi la réactivité.Conclusion :
Pour le scénario présenté, utiliser directement await LongProcess()
est l'approche optimale et la plus efficace. Les méthodes asynchrones gèrent intrinsèquement la concurrence ; l'ajout de Task.Run
n'apporte aucun avantage et ajoute de la complexité.
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!