c#-确保对字典中值列表的线程安全操作

我有一个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关键字,该关键字只有在完全相同的类型上使用时才被调用,这意味着如果将列表强制转换为基本列表,则不会调用该列表,因此孔结构将失败.

通过封装,您只给调用者一个方法,您可以在其中控制所有内容.

不知道此解决方案是否适合您的需求,但希望它为您提供一些有关如何管理东西的提示.

上一篇:Mysql InnoDB从读取行锁定


下一篇:在Linux上使用mkdir作为基于文件的锁定是一种好习惯吗?