如何在c#中使用TPL(任务并行库)加快填充列表的速度

时间:2016-09-16 06:09:56

标签: c# task-parallel-library parallel.foreach

我有以下代码

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。但同样的问题: - 它真的会给予任何提升或不提供。如果没有,那么我很有兴趣知道为什么??

1 个答案:

答案 0 :(得分:1)

您可以使用PLINQ(aka Parallel Linq)轻松并行化您的代码:

var _itemsSource = Network.Shelves
    .SelectMany(s => s.Equipment)
    .AsParallel()
    .Select(e => new GridVM(e))
    .ToList();

如果构造函数需要时间,它可能会执行得更快。如果开销只是“将项目添加到列表中”,那么您将什么都得不到。也就是说,如果只需要8秒钟就可以将项目添加到列表中,那么您肯定会遇到其他问题,例如内存消耗。