如何同时更新两个词典

时间:2012-12-10 09:06:55

标签: .net c#-4.0 concurrency thread-safety

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

2 个答案:

答案 0 :(得分:3)

最简单的方法是使用锁:

private object m_methodMonitor = new object();

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


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

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

答案 1 :(得分:2)

这里的挑战是要求两个词典必须原子地修改ConcurrentDictionary<TKey,TValue>类没有任何内置机制来支持“分组”实例,以允许同时更新共享相同密钥的键值对。

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

在一组对象上进行原子操作唯一可以做的就是在锁定机制中包装对象的访问权限:

public void Update(...)
{
    lock(this.dictionaryLock)
    {
        this.dictionaryA.AddOrUpdate(...);
        this.dictionaryB.AddOrUpdate(...);
    }
}

使用不同的锁定机制可能会获得更好的结果,优化应用程序的常见模式(例如,如果您的应用程序经常阅读并且不经常修改,则使用ReaderWriterLockSlim),但您只能序列化访问权限整本字典。

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