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.
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();
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.
AsyncContext.RunTask
Lorsque la synchronisation du contexte est essentielle, AsyncContext.RunTask
fournit un contexte imbriqué:
var result = AsyncContext.RunTask(MyAsyncMethod).Result;
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)
.
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();
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.
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!