栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Parallel.ForEach中嵌套等待

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Parallel.ForEach中嵌套等待

背后的整个想法

Parallel.ForEach()
是,您有一组线程,每个线程处理集合的一部分。正如您所注意到的,这不适用于
async
-
await
,您想在异步调用期间释放线程。

您可以通过阻塞

ForEach()
线程来“修复”该问题,但这使
async
- 的全部观点无效
await

您可以做的是使用TPL Dataflow代替

Parallel.ForEach()
,它
Task
很好地支持异步。

具体来说,您的代码可以使用a编写

TransformBlock
,该代码
Customer
使用
async
lambda 将每个id转换为a
。可以将该块配置为并行执行。您可以将该块链接到,
ActionBlock
然后将每个块写入
Customer
控制台。设置区块网络后,您可以将
Post()
每个ID分配到
TransformBlock

在代码中:

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    });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();

尽管您可能希望将的并行性限制

TransformBlock
为一些小常数。另外,您可以限制的容量,
TransformBlock
并使用异步添加项目
SendAsync()
,例如,如果集合太大。

与您的代码(如果可行)相比,另一个好处是,写入将在单个项目完成后立即开始,而不必等到所有处理都完成了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/392917.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号