如何将项添加到字典"并行循环安全"

Ama*_*nth 7 c# dictionary parallel.foreach

我有一个Parallel.ForEach循环做一些处理.但是第一个操作是在未包含密钥的情况下在字典中添加值.添加它时出错,它表示密钥已经在字典中.我猜这个密钥是在这个线程的.Contains检查之后但是在添加之前由并行进程添加的.除了将该行放在try-catch中之外,还有另一个我可以用来防止该错误的简单解决方案吗?

Parallel.ForEach(branchFixes, b =>
{
  Parallel.ForEach(b.Value, t =>
  {
    var team = t.Key;
    if (!resultTeamDict.ContainsKey(team))
    {
      resultTeamDict.Add(team, new Dictionary<FixItem, Dictionary<BranchInfo, bool>>());
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 16

即使Dictionary<,>不在竞争条件下,也不是线程安全的.您应该使用ConcurrentDictionary<,>并且在这种情况下可能是以AddOrUpdate原子方式执行修改的方法.(我假设你想在"嵌套"字典中添加一个值.否则,请考虑TryAdd.)


Doc*_*ick 5

您可以在.NET 4.5中使用ConcurrentDictionary,并用TryAdd替换ContainsKey和Add方法调用。参见http://msdn.microsoft.com/zh-cn/library/dd287191(v=vs.110).aspx

  • .NET 4.0中引入了ConcurrentDictionary。 (2认同)