【问题标题】:thread processing a large collection in C# [closed]在 C# 中处理大型集合的线程 [关闭]
【发布时间】:2013-04-30 20:33:01
【问题描述】:

好的,我已经有一段时间没有真正不得不动态地使用大量线程了。

基本上情况是:

我有一个来自数据库查询的大型集合,过分地说,100 万行已返回并存储在某种类型的集合中(arraylist、map 等)。我希望能够获取该集合并将其在线程、进程等之间进行划分,以便可以有效地完成工作。但是我不想将整个集合平均分成不同的进程。我想说 10 个线程,每个线程处理 30 行,当它们处理完他们拥有的内容后,它们会从原始集合中获取更多行。

这是解决这个问题的第一个想法。我不确定集合到线程的动态分配会是什么样子。我最终希望收集所有单独的流程结果并将它们编译到另一个集合中,以供将来处理。我知道查询结果将是非常多的行,并认为最初动态地将部分分配给线程并在它们完成任务时将是处理此问题的最佳方法。

这是一个两部分的问题。一,什么会......说......伪代码看起来像这样?第二,这是处理这种情况的最佳方法吗?

任何帮助将不胜感激。哦,我正在考虑为此使用 C#。

谢谢!

【问题讨论】:

标签: c# multithreading collections parallel-processing


【解决方案1】:

我想PLINQ (Parallel Linq) 是显而易见的选择。来自 MSDN 的一个简单示例:

var source = Enumerable.Range(1, 10000);


// Opt-in to PLINQ with AsParallel 
var evenNums = from num in source.AsParallel()
               where Compute(num) > 0
               select num;

这通常假设您的收藏中的所有项目和处理都是独立的。另一个选项可能是用于更高级操作的 TPL(任务并行库)。这是 TPL 的一个很好的 raytracer 示例。

【讨论】:

    【解决方案2】:

    您可以有一个方法负责分发列表的各个部分,然后让各个工作线程在完成当前的部分后请求一个部分。 manager 方法必须是线程安全的,但除此之外它几乎可以自行构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2018-04-05
      • 2020-01-27
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多