c#中的并行foreach

时间:2014-11-20 15:06:01

标签: c#

如果我在代码

下运行,我的索引超出范围错误
var list=new list<PriceDetails>();
Parallel.ForEach(productResults.Items, productPrices =>
{
    var  priceDetail=new PriceDetails { price=productPrices.prices.firstordefault();}
    list.add(priceDetail);
}

请提供一个解决上述问题的示例 - 使用并发?

2 个答案:

答案 0 :(得分:7)

List<T>的设计假设它永远不会同时从多个线程访问。从多个线程并行操作它是不安全的。您需要使用 支持的不同类型的数据结构,例如System.Collections.Concurrent中的内容。好吧,那或者你可能不会开始并行执行此操作。我认为没有任何理由首先将这项任务并行化。

答案 1 :(得分:2)

您遇到的问题是List.Add(不支持多个线程同时使用它。更好的解决方案是使用PLinq通过其List<PriceDetails>AsParallel()函数创建ToList()

var list = productResults.Items
                 .AsParallel()
                 .Select(productPrices => new PriceDetails { price = productPrices.prices.firstordefault()})
                 .ToList();

此代码将并行浏览您的源集合,构建新类,然后将所有内容组合到列表中并将其分配给变量。

但是,我会测试这个有和没有AsParallel()并行确实有开销成本并且使新类通常是一个廉价的操作。如果没有AsParallel()修饰符,您可能会发现代码运行得更快。