C# 线程安全列表还是多个列表?
我有两本字典的目录。我将为每个线程查询一个用户,最多50个用户/线程 第一个列表“用户”,每个线程只包含一个条目。 第二个列表“items”,每个线程可能包含数千个条目(300是一个很好的平均值) 目前,我在单个线程中顺序查询用户:首先,收集一个用户的数据(这是同步实现的,包括~100ms的普通等待),然后将用户添加到“用户”中,然后处理每个项目,一次一个,并添加到“项目”中(处理1000个项目大约需要十几毫秒) 虽然列表是有序的,但我根本不需要保留任何顺序 我现在的想法如下:C# 线程安全列表还是多个列表?,c#,multithreading,list,C#,Multithreading,List,我有两本字典的目录。我将为每个线程查询一个用户,最多50个用户/线程 第一个列表“用户”,每个线程只包含一个条目。 第二个列表“items”,每个线程可能包含数千个条目(300是一个很好的平均值) 目前,我在单个线程中顺序查询用户:首先,收集一个用户的数据(这是同步实现的,包括~100ms的普通等待),然后将用户添加到“用户”中,然后处理每个项目,一次一个,并添加到“项目”中(处理1000个项目大约需要十几毫秒) 虽然列表是有序的,但我根本不需要保留任何顺序 我现在的想法如下: 第一个列表是C
- 第一个列表是ConcurrentBag的好地方
- 对于第二个列表,最好使用多个列表,每个线程一个,这些列表最终集中在一起
System.Collections.Concurrent
命名空间中的任何集合(包括ConcurrentBag
)可以满足您的多线程需求
根据经验,我可以说,在一个简单的字典
(在系统.Collections.Generic
命名空间中)周围使用锁(lock
)对于一个巨大的内存中的、仅添加的集合来说效果很好。在生产中,它定期保存数百万个没有问题的项目,甚至有一个周期性的过程来旋转和删除“过期的”项目
因此,归根结底,您不需要为这些项目建立50个单独的列表,然后再将它们连接起来。但是,当然,这种方法也可能会很好地工作。它可能会归结为您个人认为最方便的任何方法。您为什么要为每个线程查询一个用户?而不是了解应用程序的设置/设计后,除了多线程之外,似乎没有其他理由需要很多线程。@Joeb454我们查询的原始API(来自其他供应商)的设计允许每次调用只请求一个用户,因为每个用户的数据可能存储在不同的端点上。