Exécuter des méthodes asynchrones de manière synchrone
La programmation asynchrone en C# offre un moyen efficace de gérer les opérations de longue durée sans geler le thread principal de l'application. Cependant, des situations peuvent survenir dans lesquelles vous devez appeler une méthode asynchrone de manière synchrone à partir d'un contexte synchrone.
La solution : employer Task.Run
Pour réaliser une exécution synchrone d'une méthode asynchrone, la méthode Task.Run
propose une solution pratique. Il décharge l'opération asynchrone sur un thread du pool de threads, permettant au thread appelant d'attendre la fin :
<code class="language-csharp">string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();</code>
Pourquoi éviter d'utiliser directement .Result
?
Bien qu'accéder à la propriété Result
d'une tâche puisse sembler simple, cela comporte deux risques potentiels :
.Result
peut entraîner des blocages si l'opération asynchrone tente d'accéder au thread principal alors qu'il est déjà bloqué en attendant le résultat. Task.Run
atténue ce risque en exécutant l'opération asynchrone sur un thread séparé..Result
encapsule les exceptions de la méthode asynchrone dans un AggregateException
. L'utilisation de .GetAwaiter().GetResult()
évite cela en déballant l'exception, simplifiant ainsi la gestion des erreurs.Résumé
L'utilisation de Task.Run
en conjonction avec son waiter fournit une approche fiable et efficace pour invoquer de manière synchrone des méthodes asynchrones dans du code synchrone. Cette méthode évite les blocages potentiels et simplifie la gestion des exceptions.
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!