如果我的代码如下:
var dict = new Dictionary<string, NetObject>();
Parallel.ForEach(results, options, result =>
{
var items = parser.Parse(result);
Parallel.ForEach(items, options, nextObject =>
{
if (nextObject != null)
{
dict[nextObject.Id] = nextObject;
}
});
});
dict是在方法级别定义的字典。我的问题是,它是否会导致并行foreach以同步方式像普通foreach一样工作,因为它是全局对象?对于上面的代码,我没有看到正常的foreach和parallel之间有任何性能差异。
答案 0 :(得分:3)
您的代码不是线程安全的。你正在改变一个不是线程安全数据结构的Dictionary<K, V>
。此外,您最有可能将循环与Parallel.ForEach
并行化,以迭代内部和外部循环。
让我建议使用PLINQ的不同方法,它不需要您同步全局Dictionary
。请注意,执行此操作时应确保没有重复的键(可能需要额外的.Distinct()
调用):
results
.AsParallel()
.SelectMany(x => parser.Parse(x))
.Where(x => x != null)
.ToDictionary(x => x.Id, x => x);
但是,当然,最重要的是对代码进行基准测试,以确保并行性实际上提高了性能,并且您从中获得了任何东西。