这更像是一个概念性问题。我想知道我是否使用了 lock
Parallel.ForEach<>
内部loop 如果这会带走并联 a foreach
的好处环形。
这是我看到的一些示例代码。
Parallel.ForEach<KeyValuePair<string, XElement>>(binReferences.KeyValuePairs, reference =>
{
lock (fileLockObject)
{
if (fileLocks.ContainsKey(reference.Key) == false)
{
fileLocks.Add(reference.Key, new object());
}
}
RecursiveBinUpdate(reference.Value, testPath, reference.Key, maxRecursionCount, ref recursionCount);
lock (fileLocks[reference.Key])
{
reference.Value.Document.Save(reference.Key);
}
});
在哪里fileLockObject
和 fileLocks
如下面所述。
private static object fileLockObject = new object();
private static Dictionary<string, object> fileLocks = new Dictionary<string, object>();
这种技术是否使循环完全不并行? 我想看看你对此的看法。
最佳答案
这意味着 lock
内的所有工作不能并行完成。这极大地损害了这里的性能,是的。由于 整个 主体并未全部锁定(并锁定在同一个对象上),但这里仍然存在一些并行化。您所获得的并行化是否增加了足够的好处以超过管理线程和围绕锁同步所带来的开销,您真的只需要用您的特定数据来测试自己。
就是说,看起来您正在做的事情(至少在第一个锁定的 block 中,这是我更关心的是每个线程都锁定在同一个对象上)正在锁定对 字典
。您可以改用 ConcurrentDictionary
,它专门设计用于多线程,并且可以最大限度地减少需要完成的同步量。
关于c# - LINQ Parallel.ForEach<> 循环上的 lock 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838121/