Maison > développement back-end > C++ > Await Task.Run ou Await Async : quand devez-vous choisir lequel ?

Await Task.Run ou Await Async : quand devez-vous choisir lequel ?

Linda Hamilton
Libérer: 2025-01-22 18:36:13
original
747 Les gens l'ont consulté

Await Task.Run vs. Await Async: When Should You Choose Which?

Programmation asynchrone .NET : Choix des méthodes await Task.Run et await Async

Dans la programmation asynchrone .NET, l'utilisation des méthodes asynchrones await Task.Run et await prête souvent à confusion. Cet article illustrera la différence entre les deux à travers un scénario concret et fournira une compréhension globale.

Scène :

Considérez les deux extraits de code suivants :

<code class="language-csharp">await Task.Run(() => LongProcess());</code>
Copier après la connexion

et

<code class="language-csharp">await LongProcess();</code>
Copier après la connexion

LongProcess est une méthode asynchrone, incluant les appels asynchrones, tels que await ExecuteReaderAsync().

Réponse :

Dans ce scénario particulier, il n'y a pas de différence significative entre les deux méthodes. Les deux utilisent le mot-clé await pour rendre le contrôle à l'appelant avant que l'opération asynchrone dans LongProcess ne soit terminée.

La nature de l'exécution asynchrone

Contrairement à la croyance populaire, le code asynchrone ne s'exécute pas sur plusieurs threads. Au lieu de cela, il s'exécute sur un thread, en utilisant une technique appelée « changement de contexte ».

Lorsqu'une fonction asynchrone appelle une autre fonction asynchrone, le thread actuel suspend temporairement l'exécution de l'appelant et continue l'exécution de l'appelé. Le système d'exploitation attribue ensuite le thread suspendu à d'autres tâches disponibles.

Cependant, une fois qu'une instruction await est rencontrée dans l'appelé, le thread actuel revient à l'appelant, reprenant ainsi l'exécution de l'appelant.

DirectawaitAvantages des méthodes asynchrones

Dans le scénario donné, puisque LongProcess est déjà une méthode asynchrone, il n'est pas nécessaire de l'envelopper explicitement dans await avant Task.Run. Les méthodes asynchrones directes await permettent aux threads de commencer immédiatement à effectuer d'autres tâches en attendant la fin de LongProcess.

Task.Run scénarios d'utilisation

Task.Run a ses cas d'utilisation spécifiques, par exemple :

  • Démarrez une nouvelle tâche sans l'attendre, permettant l'exécution non bloquante d'opérations chronophages.
  • Exécutez des opérations potentiellement gourmandes en CPU sur un thread d'arrière-plan, libérant ainsi le thread de l'interface utilisateur pour une interaction utilisateur réactive.

Résumé

Dans le scénario donné, les deux méthodes sont fonctionnellement équivalentes. Cependant, l'approche asynchrone directe await est préférable car elle réduit le changement de thread et permet une utilisation plus efficace du pool de threads.

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