如果我正在使用来自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);
答案 0 :(得分:2)
这些数据结构无法允许您在概念原子块中对它们执行多个操作。
如果您无法编写仅依赖于单个方法调用的工作代码,那么您需要编写自己的并发数据结构,专门支持您需要的操作或使用非并发数据结构并同步对它的所有访问。