线程安全列表或concat多个列表?

时间:2014-10-16 13:22:05

标签: c# multithreading list

我有两个词典列表。我将每个线程查询一个用户,最多总共50个用户/线程。

第一个列表" users",每个线程只包含一个条目。 第二个列表" items",每个线程可能包含数千个条目(300是一个很好的平均值)。

目前,我在一个线程中依次查询用户:首先,收集一个用户的数据(这是同步实现的,包括~100ms的普通等待),然后用户将被添加到"用户",然后每个项目将被处理,一次一个,并添加到"项目" (处理1000件物品需要大约十几毫秒)。

在订购清单时,我根本不需要保留任何订单。

我现在想到如下:

  • 第一个列表是ConcurrentBag的好地方。
  • 对于第二个列表,最好使用多个列表,每个线程一个,最后连接在一起。

但是在我这样做之前,我想问你这是否是最好的方法,或者你是否能想到更好的解决方案。在待并行化的部分中,我不会在任何一个列表上做任何事情,而是添加项目。

1 个答案:

答案 0 :(得分:2)

根据这篇Thread-Safe Collections文章,System.Collections.Concurrent命名空间(包括ConcurrentBag)中的任何集合都应该适合您的多线程需求。

我可以从经验中说,在简单的lock(在Dictionary命名空间中)使用System.Collections.Generic可以很好地处理大型内存中的仅添加集合。在生产中,它经常持有数百万件没有问题的物品,即使是通过定期过程来旋转和移除过期的#34;项目

如此底线,你不应该为这些项目建立50个单独的列表,然后再将它们连接起来。但是,当然,这种方法可能也会很好。它可能只是归结为你个人认为最方便的。