gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:35:53 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com