2016-09-16 100 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秒將項目添加到列表中,那麼您肯定會遇到其他問題,例如內存消耗。

相關問題