C#词典中的更新键(ConcurrentDictionary)

时间:2018-12-18 18:30:25

标签: c# dictionary concurrency

我想向ConcurrentDictionary周围的可观察包装器类添加UpdateKey方法。像这样:

private bool UpdateKeyWithNotification(TKey key1, TKey key2)
{
    if (key1.Equals(key2)) return false;
    TValue value;
    var result = _dictionary.TryRemove(key1, out value);
    if (!result) return false;
    result = _dictionary.TryAdd(key2, value);
    if (result) NotifyObserversOfChange();
    return result;
}

显然,此操作不再是原子的,因为它先执行删除再添加。我对UpdateKeyWithNotification的性能要求不高,因为它很少使用,但我想为_dictionaryTryRemove之间的后退TryAdd提供某种类型的执行保证。我可以在TryRemove和TryAdd操作周围添加某种类型的RWMutex或锁定对象。但这可能意味着我还必须在类中的所有其他方法周围添加锁语句。我的解决方案有替代方案吗?

1 个答案:

答案 0 :(得分:0)

您根本无法使用ConcurrentDictionary来对其所有内置方法进行原子操作(请注意,SyncRoot属性不会提供帮助,因为它不受支持。

您可以使用外部同步机制,但随后您将不会立即从ConcurrentDictionary中获得任何收益,实际上使其并发性降低。

由于您实际上是在重新输入某些数据的密钥,因此建议您从DictionaryBase派生一个线程安全的包装器,并添加您的specialize方法。