Intégration du code asynchrone et synchrone dans C #
De nombreux projets C # ne sont pas entièrement asynchrones. Cet article relève des défis et des solutions pour appeler des méthodes asynchrones à partir de contextes synchrones.
est-il possible?
Oui, il est possible d'appeler des méthodes asynchrones à partir du code synchrone. Cependant, les différents modèles d'exécution de programmation synchrone et asynchrone peuvent créer des complexités.
Approches de l'intégration sûre
Plusieurs approches facilitent cette intégration:
Méthode 1: Task.WaitAndUnwrapException
Pour les méthodes asynchrones qui ne nécessitent pas de synchronisation de contexte (chacune await
utilise ConfigureAwait(false)
), Task.WaitAndUnwrapException
fournit un moyen sûr d'attendre l'achèvement et de récupérer le résultat:
<code class="language-csharp">var task = MyAsyncMethod(); var result = task.WaitAndUnwrapException(); </code>
Méthode 2: AsyncContext.RunTask
(pour les attentes sensibles au contexte)
Si une synchronisation de contexte est nécessaire dans la méthode asynchrone, AsyncContext.RunTask
crée un contexte imbriqué pour exécuter la tâche:
<code class="language-csharp">var result = AsyncContext.RunTask(MyAsyncMethod).Result;</code>
Méthode 3: Task.Run
(pour la compatibilité du pool de threads)
Lorsque AsyncContext.RunTask
n'est pas applicable, Task.Run
décharge la méthode asynchrone au pool de threads. La méthode asynchrone doit être compatible avec le contexte du pool de threads:
<code class="language-csharp">var task = Task.Run(async () => await MyAsyncMethod()); var result = task.WaitAndUnwrapException();</code>
Choisir la bonne approche dépend des besoins spécifiques de votre méthode asynchrone et de son interaction avec le code synchrone environnant. Un examen attentif du contexte et des blocages potentiels est crucial.
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!