c# - LINQ Parallel.ForEach<> 循环上的 lock 关键字

标签 c# .net linq parallel-processing parallel.foreach

这更像是一个概念性问题。我想知道我是否使用了 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);
    }
});

在哪里fileLockObjectfileLocks如下面所述。

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/

相关文章:

子类的 C# json 动态契约(Contract)解析器

c# - iTextSharp 第一页文字更高

c# - .Net framework 3.0、3.5、2.0 在 Visual Studio 2012 中不显示,在 Windows 8.1 中仅显示 4.0 和 4.5

c# - 我可以告诉 bindingRedirect 始终使用最新的可用版本吗?

c# - 使用 linq 执行此操作的更好方法

c# - 在 mvc 4.0 razor 中添加 nopcommerce 购物车

c# - 通过文件共享、用户身份验证通过网络复制文件

.net - Oracle ManagedDataAccess Client 和关闭连接

c# - 自定义 Linq 扩展语法

asp.net-mvc - LINQ 到 SQL : making a "double IN" query crashes