Cet article relève le défi de l'exécution de plusieurs appels WCF asynchrones en toute sécurité et efficacement dans une application .NET. L'approche naïve de la nidification await
dans Parallel.ForEach
conduit souvent à une terminaison prématurée et à des opérations incomplètes.
La solution recommandée exploite le cadre de flux de données de la bibliothèque parallèle de la tâche (TPL). Plus précisément, l'utilisation TransformBlock
et ActionBlock
fournit un mécanisme robuste et contrôlé pour les opérations asynchrones parallèles.
Le code suivant montre comment refactoriser le code d'origine à utiliser TransformBlock
et ActionBlock
pour les appels WCF simultanés:
var ids = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; var getCustomerBlock = new TransformBlock<string, Customer>( async i => { ICustomerRepo repo = new CustomerRepo(); return await repo.GetCustomer(i); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded // Or specify a limit }); var writeCustomerBlock = new ActionBlock<Customer>(c => Console.WriteLine(c.ID)); getCustomerBlock.LinkTo(writeCustomerBlock, new DataflowLinkOptions { PropagateCompletion = true }); foreach (var id in ids) { getCustomerBlock.Post(id); } getCustomerBlock.Complete(); writeCustomerBlock.Completion.Wait();
Cette approche offre plusieurs avantages clés:
MaxDegreeOfParallelism
permet de contrôler le niveau de concurrence, empêchant l'épuisement des ressources. Ceci est crucial lorsqu'il s'agit d'un grand nombre d'ID. Cette méthode garantit que les appels WCF asynchrones sont exécutés simultanément tout en conservant une gestion des erreurs et une gestion des ressources appropriés, fournissant une solution plus fiable et efficace.
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!