2016-09-16 37 views
0

我有下面这段代码如何加快在C#中使用填充TPL(任务并行库)列表

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

+2

列表不是线程安全的,你从tpl中获得任何东西 –

+0

@RoyiNamir如果我使用ConcurrentList,该怎么办。考虑到线程和锁定开销,它能让我以任何方式提升性能 –

+2

您可以使用PLinq并行地调用构造函数(不确定你在内部做了些什么,以便花费那么多时间,但除此之外,这就是:'Network .Shelves.SelectMany(s => s.Equipment).AsParallel()。选择(e => new GridVM(e))'填充列表如果几乎空闲,您将不会获得任何试图并行执行的操作 –

回答

1

可以使用PLINQ(又名并行LINQ)轻松地并行代码:

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

如果构造需要一定的时间,可能执行得更快。如果开销只是“将项目添加到列表中”,那么您将不会获得任何收益。也就是说,如果仅仅需要8秒将项目添加到列表中,那么您肯定会遇到其他问题,例如内存消耗。

相关问题