我需要支持更新两个并发字典(在创建、更新、删除时)的功能。每个操作(更新、删除、创建)使用其中的两个并且应该是原子的。在 .NET C# 中执行此操作的最佳方法是什么。
问问题
193 次
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 回答