我有一个 Dictionary<object1, List<object2>
(我为我的结构做的抽象,有点复杂)。
字典中的列表是在非并行上下文中初始化的,但是向列表中添加新元素需要线程安全的方法。不会发生删除项目(字典对象将在事务结束时处理)。 此外,键值对仅在初始化时添加,因此在工作期间不会在字典中添加或删除任何键,只会更新值。
我无法使用并发集合,我被困在旧的 .NET Framework 中。
起初我用 ReadWriteSlimlock
锁定了整个字典。 .嗯,这是非常糟糕的表现。有许多添加操作正在发生,它们只是在等待另一个。只锁定每个列表是一个更好的解决方案,因为至少我正在为每个键并行执行操作。
另外,添加操作也不简单list.Add(object2)
, 添加时需要在线程安全区进行一些其他复杂的操作。
但我不知道什么是最好的实现方式:
-
lock(dictionary.Value)
? - 使用
ReadWriteSlimlock
的字典(每个键一个)? - 还有其他更好的解决方案吗?
最佳答案
另一种解决方案可能是实现您的一致 List<object>
类(class)。
像这样的东西:
public class ConcurentList {
private object sync = new object();
private List<object> realList = new List<object>();
public void Add(object o) {
lock(sync){
realList.Add(o);
}
}
/** ADD OTHERE METHODS IMPEMENTATION IF NEED **/
}
在字典中有:
Dictionary<object1, ConcurentList>
为什么封装而不扩展List<object>
, 是原因 Add
方法不是虚拟的,所以你可以“覆盖”它的唯一方法是使用 new
关键字,如果用在完全相同的类型上,则保证仅被调用,这意味着如果您将 list 转换为基数,它不会被调用,所以 hole架构将失败。
通过封装,你只给调用者一个方法,你可以控制一切。
不知道这个解决方案是否满足您的需求,但希望它能给您一些关于如何管理内容的提示。
关于c# - 确保字典中值的列表的线程安全操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14378202/