2

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

4

2 回答 2

3

最简单的方法是使用锁:

private object m_methodMonitor = new object();

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


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

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

于 2012-12-10T09:15:47.530 回答
2

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

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

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

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

您可能会使用不同的锁定机制获得更好的结果,优化应用程序的常见模式(例如,ReaderWriterLockSlim如果您的应用程序倾向于频繁读取和不经常修改,则使用 a),但您将只能序列化对整个字典的访问。

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

于 2012-12-10T09:36:54.647 回答