Parallel.ForEach和全局变量

时间:2016-09-02 11:26:06

标签: c# foreach parallel.foreach plinq

如果我的代码如下:

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之间有任何性能差异。

1 个答案:

答案 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);

但是,当然,最重要的是对代码进行基准测试,以确保并行性实际上提高了性能,并且您从中获得了任何东西。