Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何同时更新两个词典_.net_C# 4.0_Concurrency_Thread Safety - Fatal编程技术网

.net 如何同时更新两个词典

.net 如何同时更新两个词典,.net,c#-4.0,concurrency,thread-safety,.net,C# 4.0,Concurrency,Thread Safety,我需要支持更新两个并发字典的功能(创建、更新、删除)。 每个操作(更新、删除、创建)使用其中两个操作,并且应该是原子操作。在.NET C#中执行此操作的最佳方法是什么。最简单的方法是使用锁: private object m_methodMonitor = new object(); private void Update() { lock (m_methodMonitor) { // Do whatever } } private void Del

我需要支持更新两个并发字典的功能(创建、更新、删除)。
每个操作(更新、删除、创建)使用其中两个操作,并且应该是原子操作。在.NET C#中执行此操作的最佳方法是什么。

最简单的方法是使用锁:

private object m_methodMonitor = new object();

private void Update()
{
    lock (m_methodMonitor)
    {
        // Do whatever
    }
}


private void Delete()
{
    lock (m_methodMonitor)
    {
        // Do whatever
    }
}

请注意:锁定字典上的“写入”操作是不够的!您还需要同步字典的读取,以避免在尝试从字典中获取值时出现这种情况,该值当前正由其中一个更新方法访问。

这里的挑战是要求两个字典都必须进行原子修改。
ConcurrentDictionary
类没有任何内置机制来支持将实例“分组”在一起,以允许同时更新共享同一密钥的键值对

因此,您无法使用任何高吞吐量机制来授予您操作中的原子性

要对一组对象执行原子操作,您唯一能做的就是将对对象的访问包装在锁定机制中:

public void Update(...)
{
    lock(this.dictionaryLock)
    {
        this.dictionaryA.AddOrUpdate(...);
        this.dictionaryB.AddOrUpdate(...);
    }
}
使用不同的锁定机制,优化应用程序的常见模式(例如,如果应用程序倾向于频繁阅读和不频繁修改,则使用a),可能会获得更好的结果,但只能序列化对整个字典的访问


如果并发性能对您非常重要,则必须重构设计,以使用一个而不是两个并发字典。

每个键的锁定机制如何?应该注意,要使其在访问字典实例的任何地方都能工作,必须在类似的
lock
语句中执行,不仅仅是对列出的三个操作。@user547297:每个键锁定是不可能的,而且也不是必需的。与只在插入/更新/删除所需的较短时间内锁定整个词典相比,实现锁定词典中单个条目的操作会带来更多开销。我不明白为什么需要使用两个锁?此外,每当您使用两个锁时,如果您沿着两个代码路径尝试以不同的顺序获取锁,则会有死锁的风险。-1表示使用两个锁。这是危险的,没有必要的!当你说“并发字典”时,你指的是什么类别?System.Collections.concurrent.ConcurrentDictionary