我有一个Dictionary< object1,List< object2> (我为我的结构做了一个抽象,有点复杂).
字典中的列表是在非并行上下文中初始化的,但是向列表中添加新元素需要一个线程安全的方法.不会发生删除项目(字典对象将在交易结束时被处理).
另外,键值对仅在初始化时添加,因此在工作期间不会从字典中添加或删除键,而仅更新值.
我不能使用并发集合,我陷于旧的.NET Framework中.
首先,我用ReadWriteSlimlock锁定了整个字典.好吧,这是非常糟糕的表现.发生了许多添加操作,它们只是在等待另一个.仅锁定每个列表是一个更好的解决方案,因为至少我在并行处理每个键.
另外,添加操作不是简单的list.Add(object2),添加时还需要在线程安全区域中进行一些其他复杂的操作.
但是我不知道实现它的最佳方法是什么:
>锁定(dictionary.Value)?
>使用ReadWriteSlimlock字典(每个键一个)?
>还有其他更好的解决方案吗?
解决方法:
另一个解决方案可以是实现您同意List< object>类.
就像是:
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关键字,该关键字只有在完全相同的类型上使用时才被调用,这意味着如果将列表强制转换为基本列表,则不会调用该列表,因此孔结构将失败.
通过封装,您只给调用者一个方法,您可以在其中控制所有内容.
不知道此解决方案是否适合您的需求,但希望它为您提供一些有关如何管理东西的提示.