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

标签 c# multithreading thread-safety locking

我有一个 Dictionary<object1, List<object2> (我为我的结构做的抽象,有点复杂)。

字典中的列表是在非并行上下文中初始化的,但是向列表中添加新元素需要线程安全的方法。不会发生删除项目(字典对象将在事务结束时处理)。 此外,键值对仅在初始化时添加,因此在工作期间不会在字典中添加或删除任何键,只会更新值。

我无法使用并发集合,我被困在旧的 .NET Framework 中。

起初我用 ReadWriteSlimlock 锁定了整个字典。 .嗯,这是非常糟糕的表现。有许多添加操作正在发生,它们只是在等待另一个。只锁定每个列表是一个更好的解决方案,因为至少我正在为每个键并行执行操作。 另外,添加操作也不简单list.Add(object2) , 添加时需要在线程安全区进行一些其他复杂的操作。

但我不知道什么是最好的实现方式:

  1. lock(dictionary.Value)
  2. 使用 ReadWriteSlimlock 的字典(每个键一个)?
  3. 还有其他更好的解决方案吗?

最佳答案

另一种解决方案可能是实现您的一致 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/

相关文章:

c# - 使用反射按名称获取属性值

c# - 在C#中实现同步算法

java - 如何正确使用 setPriority() 方法?

c# - 在 C# wpf 应用程序中处理线程

python - 设置当线程以其他方式完成时要执行的行为

C# 泛型方法值

c# - 关闭 SqlConnection 和 SqlCommand c#

c# - 需要从空格分隔的字符串中的特定位置删除特定引号,同时保留其他引号

python 线程并行运行?

multithreading - 一个进程之间的线程可见性