如何在c#中使用TPL(任务并行库)加速填充列表
本文关键字:并行 任务 加速 列表 填充 TPL | 更新日期: 2023-09-27 18:07:09
我有以下一段代码
List<GridVM> _itemsSource = new List<GridVM>();
foreach(var shelf in Network.Shelves)
{
foreach(var equipment in shelf.Equipment)
{
var gridVM= new GridVM(equipment);
itemSource.Add(gridVM);
}
}
这里_itemSource是一个集合,它将成为一个网格的数据源。
现在为每个设备创建每个vm对象需要一点点时间~~大约8秒。我想通过在不同的线程中运行内部forloop来加速使用TPL的网格数据源填充,并将vm添加到_itemSource的主集合中。
如何使用TPL实现。考虑到线程开销和锁开销,它真的会加快我的工作速度吗?我可以将当前列表项源转换为ConcurrentList或concurrentbag。但同样的问题是:它真的会起到推动作用吗?如果不是,我很想知道为什么??
你可以使用PLINQ(又名Parallel Linq)轻松地并行化你的代码:
var _itemsSource = Network.Shelves
.SelectMany(s => s.Equipment)
.AsParallel()
.Select(e => new GridVM(e))
.ToList();
如果构造函数占用时间,则可能执行得更快。如果开销只是"向列表中添加项目",那么您将一无所获。也就是说,如果仅仅将项目添加到列表中就需要8秒,那么您肯定有其他问题,例如内存消耗。