我想向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的性能要求不高,因为它很少使用,但我想为_dictionary
和TryRemove
之间的后退TryAdd
提供某种类型的执行保证。我可以在TryRemove和TryAdd操作周围添加某种类型的RWMutex或锁定对象。但这可能意味着我还必须在类中的所有其他方法周围添加锁语句。我的解决方案有替代方案吗?
答案 0 :(得分:0)
您根本无法使用ConcurrentDictionary
来对其所有内置方法进行原子操作(请注意,SyncRoot属性不会提供帮助,因为它不受支持。
您可以使用外部同步机制,但随后您将不会立即从ConcurrentDictionary
中获得任何收益,实际上使其并发性降低。
由于您实际上是在重新输入某些数据的密钥,因此建议您从DictionaryBase派生一个线程安全的包装器,并添加您的specialize方法。