Appeler de manière synchrone des méthodes asynchrones
Question :
Vous disposez d'une méthode asynchrone avec la signature suivante :
<code class="language-c#">public async Task<string> GenerateCodeAsync() { string code = await GenerateCodeService.GenerateCodeAsync(); return code; }</code>
Cependant, vous devez appeler cette méthode de manière synchrone dans un contexte de synchronisation. Comment y parvenir ?
Solution :
Afin d'appeler une méthode asynchrone de manière synchrone, vous pouvez utiliser un thread de pool de threads pour exécuter la méthode. En utilisant l'attente de la tâche, vous pouvez bloquer le thread appelant jusqu'à la fin de l'opération asynchrone :
<code class="language-c#">string code = Task.Run(() => GenerateCodeAsync()) .GetAwaiter() .GetResult();</code>
Remarque :
Vous devez faire attention aux inconvénients de l'utilisation directe de .Result
:
.Result
peut provoquer un blocage car le thread principal est bloqué, empêchant la méthode asynchrone de se terminer. Pour éviter cela, utilisez .ConfigureAwait(false)
avec prudence. Cette approche n’est pas sans complications. Cependant, utiliser Task.Run
pour exécuter une méthode asynchrone sur un thread de pool de threads élimine ce problème potentiel. .Result
Encapsulez toutes les exceptions lancées dans une méthode asynchrone dans AggregateException
. Pour éviter ce problème, utilisez plutôt .GetAwaiter().GetResult()
. 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!