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.)
您可以在.NET 4.5中使用ConcurrentDictionary,并用TryAdd替换ContainsKey和Add方法调用。参见http://msdn.microsoft.com/zh-cn/library/dd287191(v=vs.110).aspx
| 归档时间: |
|
| 查看次数: |
8136 次 |
| 最近记录: |