我有以下代码
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或ConcurrntBag。但同样的问题: - 它真的会给予任何提升或不提供。如果没有,那么我很有兴趣知道为什么??
答案 0 :(得分:1)
您可以使用PLINQ(aka Parallel Linq)轻松并行化您的代码:
var _itemsSource = Network.Shelves
.SelectMany(s => s.Equipment)
.AsParallel()
.Select(e => new GridVM(e))
.ToList();
如果构造函数需要时间,它可能会执行得更快。如果开销只是“将项目添加到列表中”,那么您将什么都得不到。也就是说,如果只需要8秒钟就可以将项目添加到列表中,那么您肯定会遇到其他问题,例如内存消耗。