在System.Collections.Concurrent对象上自动执行多个操作

本文关键字:执行 操作 System Collections Concurrent 对象 | 更新日期: 2023-09-27 18:04:07

如果我正在使用来自System.Collection.Concurrent命名空间的集合,例如ConcurrentDictionary<K, V>,并且我希望保持其他线程对该对象的访问和修改与我的访问和修改相交叉。

我该怎么做呢?如果可能的话,当这些操作发生时,争用线程试图访问ConcurrentDictionary时,不是会变得非常慢吗?

ConcurrentDictionary<KType, VType> conDict = ...;
// How do I ensure that these operation are performed atomically?
VType myVInst;
conDict.TryRemove(2, out myVInst);
conDict.AddOrUpdate(1, new VType(), (x, y) => y);

在System.Collections.Concurrent对象上自动执行多个操作

这些数据结构不允许您在概念上的原子块中对它们执行多个操作。

如果您无法编写只依赖于单个方法调用是原子的工作代码,那么您需要编写自己的并发数据结构,专门支持您所需的操作,或者使用非并发数据结构并同步对它的所有访问。