Maison > développement back-end > C++ > Comment puis-je appeler de manière synchrone une méthode asynchrone à l'aide de Task.Run ?

Comment puis-je appeler de manière synchrone une méthode asynchrone à l'aide de Task.Run ?

DDD
Libérer: 2025-01-19 13:47:09
original
941 Les gens l'ont consulté

How Can I Synchronously Call an Asynchronous Method Using Task.Run?

Utilisez Task.Run pour appeler des méthodes asynchrones de manière synchrone

La programmation asynchrone nous permet d'effectuer des opérations de longue durée sans bloquer le thread principal. Cependant, dans certains cas, nous devrons peut-être appeler des méthodes asynchrones de manière synchrone. Voici comment y parvenir à l'aide de Task.Run :

Scène :

Considérez la méthode asynchrone suivante :

<code class="language-c#">public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}</code>
Copier après la connexion

Supposons que nous devions appeler cette méthode de manière synchrone à partir d'une autre méthode synchrone.

Solution :

Pour exécuter une méthode asynchrone de manière synchrone, nous pouvons utiliser la méthode Task.Run pour l'exécuter dans un thread de pool de threads :

<code class="language-c#">string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();</code>
Copier après la connexion

Ce code utilise les étapes suivantes :

  1. Task.Run : Il crée une tâche de pool de threads en arrière-plan et exécute la méthode GenerateCodeAsync.
  2. GetAwaiter() : Il récupère un waiter pour la tâche, représentant le résultat de l'opération asynchrone.
  3. GetResult() : Il bloque le thread appelant jusqu'à ce que l'opération asynchrone soit terminée et renvoie le résultat de la méthode.

Inconvénients de l'utilisation de .Result directement :

La méthode simple consistant à accéder directement à la propriété Result de la tâche (c'est-à-dire string code = GenerateCodeAsync().Result;) doit être évitée car elle présente les inconvénients suivants :

  • Deadlock : Cette méthode peut provoquer un blocage si la méthode asynchrone tente d'accéder au thread de l'interface utilisateur lors du blocage. Task.Run exécute la méthode dans un thread séparé, évitant ainsi ce problème.
  • Gestion des exceptions : .Result Encapsule toute exception levée dans une méthode asynchrone dans une AggregateException. En utilisant .GetAwaiter().GetResult() nous évitons ce problème et recevons directement l'exception.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal