Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程安全列表还是多个列表?_C#_Multithreading_List - Fatal编程技术网

C# 线程安全列表还是多个列表?

C# 线程安全列表还是多个列表?,c#,multithreading,list,C#,Multithreading,List,我有两本字典的目录。我将为每个线程查询一个用户,最多50个用户/线程 第一个列表“用户”,每个线程只包含一个条目。 第二个列表“items”,每个线程可能包含数千个条目(300是一个很好的平均值) 目前,我在单个线程中顺序查询用户:首先,收集一个用户的数据(这是同步实现的,包括~100ms的普通等待),然后将用户添加到“用户”中,然后处理每个项目,一次一个,并添加到“项目”中(处理1000个项目大约需要十几毫秒) 虽然列表是有序的,但我根本不需要保留任何顺序 我现在的想法如下: 第一个列表是C

我有两本字典的目录。我将为每个线程查询一个用户,最多50个用户/线程

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

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

虽然列表是有序的,但我根本不需要保留任何顺序

我现在的想法如下:

  • 第一个列表是ConcurrentBag的好地方
  • 对于第二个列表,最好使用多个列表,每个线程一个,这些列表最终集中在一起
但在我继续这样做之前,我想问您这是不是最好的方法,或者您是否可以想出更好的解决方案。在“待并行化”部分,我将不在任何列表上做任何操作,而是添加项。

根据本文,
System.Collections.Concurrent
命名空间中的任何集合(包括
ConcurrentBag
)可以满足您的多线程需求

根据经验,我可以说,在一个简单的
字典
(在
系统.Collections.Generic
命名空间中)周围使用
锁(lock
)对于一个巨大的内存中的、仅添加的集合来说效果很好。在生产中,它定期保存数百万个没有问题的项目,甚至有一个周期性的过程来旋转和删除“过期的”项目


因此,归根结底,您不需要为这些项目建立50个单独的列表,然后再将它们连接起来。但是,当然,这种方法也可能会很好地工作。它可能会归结为您个人认为最方便的任何方法。

您为什么要为每个线程查询一个用户?而不是了解应用程序的设置/设计后,除了多线程之外,似乎没有其他理由需要很多线程。@Joeb454我们查询的原始API(来自其他供应商)的设计允许每次调用只请求一个用户,因为每个用户的数据可能存储在不同的端点上。