如何在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。但同样的问题是:它真的会起到推动作用吗?如果不是,我很想知道为什么??

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

你可以使用PLINQ(又名Parallel Linq)轻松地并行化你的代码:

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

如果构造函数占用时间,则可能执行得更快。如果开销只是"向列表中添加项目",那么您将一无所获。也就是说,如果仅仅将项目添加到列表中就需要8秒,那么您肯定有其他问题,例如内存消耗。