gpt4 book ai didi

c# - 使用 ConcurrentBag 作为 ConcurrentDictionary 的对象是否正确

转载 作者:太空狗 更新时间:2023-10-29 19:46:05 25 4
gpt4 key购买 nike

在下面的代码中:

public class SomeItem { }
public class SomeItemsBag : ConcurrentBag< SomeItem > { }
public class SomeItemsList : List< SomeItem > { }
public static class Program
{
private static ConcurrentDictionary< string, SomeItemsBag > _SomeItemsBag;
private static ConcurrentDictionary< string, SomeItemsList > _SomeItemsList;

private static void GetItem(string key)
{
var bag = _SomeItemsBag[key];
var list= _SomeItemsList[key];
...
}
}

我的假设是 bag 是线程安全的而 list 不是。这是在多线程应用程序中处理列表字典的正确方法吗?

编辑添加:只有 1 个线程将添加到包/列表中,另一个线程将删除,但许多线程可以访问。

最佳答案

您关于 ConcurrentBag 是线程安全的而 List 不是线程安全的假设是正确的。但是,您可以同步对列表的访问,例如:

private static ConcurrentDictionary< string, SomeItemsBag > _SomeItemsBag;
private static ConcurrentDictionary< string, SomeItemsList > _SomeItemsList;
private static object _someItemsListLocker = new object();

private static void GetItem(string key)
{
var bag = _SomeItemsBag[key];
lock (_someItemsListLocker) {
var list = _SomeItemsList[key];
}
}

但是,如果您需要关于应该使用哪种数据结构的更全面的建议,最好完整地描述情况。请注意,还有 ConcurrentQueueConcurrentStack 可能更适合您在列表中想要的内容。它们在多线程场景中进行了优化,因为添加和删除只能分别发生在一侧(堆栈的同一侧,队列的另一侧)。

关于c# - 使用 ConcurrentBag<T> 作为 ConcurrentDictionary<key, object> 的对象是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10403754/

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