Maison >développement back-end >C++ >Await Task.Run vs Await : quand devriez-vous utiliser lequel ?
await Task.Run
et await
L'utilisation de await Task.Run
et await
est souvent source de confusion dans les scénarios asynchrones, en particulier lorsqu'il s'agit de méthodes contenant des opérations asynchrones (telles que des appels de base de données). Analysons la différence entre ces deux méthodes dans un scénario spécifique.
Considérez l'extrait de code suivant :
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
et
<code class="language-csharp">await LongProcess();</code>
où LongProcess
est une méthode asynchrone qui effectue plusieurs appels asynchrones, tels que await ExecuteReaderAsync()
.
La principale différence entre ces deux méthodes réside dans le mécanisme sous-jacent de la méthode de traitement.
await Task.Run(() => LongProcess())
: Cette syntaxe délègue l'exécution de la méthode LongProcess
à un autre thread en dehors du pool de threads actuel. Cela permet au thread actuel de continuer à exécuter un autre code pendant que la méthode LongProcess
s'exécute de manière asynchrone sur un autre thread. await LongProcess()
: Dans ce cas, l'exécution de la méthode LongProcess
n'est pas déléguée à un autre thread. Au lieu de cela, le thread actuel suspend son exécution jusqu'à ce que la méthode LongProcess
termine son opération asynchrone. Le choix entre ces deux méthodes dépend du comportement d'exécution souhaité et de l'utilisation des ressources.
Task.Run
serait plus appropriée si votre objectif est de décharger des tâches de traitement lourdes vers un autre thread pour éviter de bloquer le thread actuel et lui permettre de gérer d'autres requêtes. Cependant, cette approche entraîne une surcharge supplémentaire en raison de la création de threads et du changement de contexte. await
si votre principale préoccupation est de minimiser l'utilisation des ressources et de garantir que le fil de discussion actuel est disponible pour répondre aux entrées de l'utilisateur. Cependant, cette approche peut entraîner le blocage du thread actuel en attendant la fin de l'opération asynchrone dans LongProcess
. await Task.Run
et await
réside dans le mécanisme de gestion des threads sous-jacent. await Task.Run
Crée un nouveau thread pour la méthode asynchrone, tandis que await
suspend le thread en cours. La méthode appropriée doit être choisie en fonction du comportement opérationnel souhaité et de l’utilisation des ressources.
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!