Maison > développement back-end > C++ > Comment puis-je appeler des méthodes C # asynchrones de manière synchrone?

Comment puis-je appeler des méthodes C # asynchrones de manière synchrone?

Mary-Kate Olsen
Libérer: 2025-02-02 13:01:09
original
521 Les gens l'ont consulté

How Can I Call Asynchronous C# Methods Synchronously?

Exécution de manière synchrone des méthodes C # asynchrones

Les méthodes asynchrones, généralement déclarées public async Task Foo(), sont cruciales pour les opérations simultanées et l'expérience utilisateur améliorée. Cependant, les intégrer dans les bases synchrones existantes nécessite une attention particulière. Examinons plusieurs approches.

Méthode 1: Task.WaitAndUnwrapException

pour les méthodes asynchrones simples qui ne reposent pas sur la synchronisation du contexte (par exemple, celles qui utilisent ConfigureAwait(false)), Task.WaitAndUnwrapException offre une solution simple:

var task = MyAsyncMethod();
var result = task.WaitAndUnwrapException();
Copier après la connexion

Cela gère soigneusement les exceptions sans la couche supplémentaire de AggregateException. Cependant, cette méthode est inappropriée si MyAsyncMethod nécessite une synchronisation de contexte.

Méthode 2: AsyncContext.RunTask

Lorsque la synchronisation du contexte est essentielle, AsyncContext.RunTask fournit un contexte imbriqué:

var result = AsyncContext.RunTask(MyAsyncMethod).Result;
Copier après la connexion

Cela empêche efficacement des blocs de blocage qui pourraient résulter de bloquer les attentes sur les tâches qui n'utilisent pas ConfigureAwait(false).

Méthode 3: Task.Run

Si AsyncContext.RunTask est inadapté (par exemple, lorsque les méthodes asynchrones attendent des événements d'interface utilisateur), déchargez la méthode asynchrone dans le pool de threads:

var task = Task.Run(async () => await MyAsyncMethod());
var result = task.WaitAndUnwrapException();
Copier après la connexion

Cette approche exige que MyAsyncMethod soit en filetage et ne dépend pas des éléments d'interface utilisateur ou du contexte de la demande ASP.NET. Alternativement, l'utilisation ConfigureAwait(false) avec la méthode 1 fournit une alternative viable.

lecture plus approfondie

Pour une compréhension plus approfondie, consultez l'article MSDN perspicace de Stephen Cleary, "Async Programming - Brownfield Async Development".

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!

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