Maison >développement back-end >C++ >Quand devriez-vous utiliser « wait Task.Run » dans les méthodes asynchrones ?

Quand devriez-vous utiliser « wait Task.Run » dans les méthodes asynchrones ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-22 18:17:09322parcourir

When Should You Use `await Task.Run` in Async Methods?

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>

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 :

  • Thème unique (principalement) : Contrairement à la croyance populaire, async/await n'utilise pas intrinsèquement plusieurs threads. Le fil s'arrête à un 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.
  • Opérations liées au processeur : Pour les tâches gourmandes en calcul, 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!

Déclaration:
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