线程/ TPL等

时间:2012-04-04 11:09:46

标签: c# multithreading c#-3.0 task-parallel-library

我需要处理1600万个数据库记录,这将永远带我。我没有穿着精明,以为我会问这里。我的想法是我需要执行以下操作但不确定如何:

  1. 获取我的16米记录
  2. 将这些分成若干“块”
  3. 发送这些块中的每一个以便在其线程上进行处理
  4. 这听起来是否正确,我将如何分配我的工作量(16米记录)......?

    如果你能提供合理的建议,欢呼。

2 个答案:

答案 0 :(得分:1)

我建议您通过以下方式使用众所周知的生产者 - 消费者模式:

  • 单个线程(生产者)从数据库中提取记录,创建任务(处理单个或多个记录)并将它们放入共享队列。
  • 一组线程(消费者)从队列中提取任务并并行处理它们。

实现此目的的一种非常简单的方法是使用ThreadPool类。它可以方便地为您管理队列和工作人员。您所需要的只是通过QueueUserWorkItem实现生产者和队列任务。

或者,如果您想使用TPL结构,您可以使用TaskConcurrentQueue的组合自己实现上述机制。

答案 1 :(得分:1)

如果您想并行处理项目集合,那正是Parallel.Foreach()的用途。你只需要传递一个你想要为每个项目执行的动作(可能是一个lambda),它将把你的集合拆分成块并执行它。

但是你必须小心你对这个行动的投入。这是因为代码将同时在更多线程上执行,因此您不应该以非线程安全的方式访问任何共享状态。