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>
et
<code class="language-csharp">await LongProcess();</code>
où 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.
Directawait
Avantages 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 :
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!