如果我在代码
下运行,我的索引超出范围错误var list=new list<PriceDetails>();
Parallel.ForEach(productResults.Items, productPrices =>
{
var priceDetail=new PriceDetails { price=productPrices.prices.firstordefault();}
list.add(priceDetail);
}
请提供一个解决上述问题的示例 - 使用并发?
答案 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()
修饰符,您可能会发现代码运行得更快。