0

我需要处理 1600 万条数据库记录,这将花费我很长时间。我不精通线程所以想我会在这里问。我的想法是我需要执行以下操作,但不确定如何:

  1. 获取我的 1600 万条记录
  2. 将它们分成许多“块”
  3. 发送这些块中的每一个以在它们的线程上进行处理

这听起来对吗?我将如何分配我的工作量(16m 记录)等等......?

如果您能提供中肯的建议,请欢呼。

4

2 回答 2

1

如果您想并行处理一组项目,这正是Parallel.Foreach()它的用途。您只需将要为每个项目执行的操作(可能作为 lambda)传递给它,它会负责将您的集合分成块并执行它。

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

于 2012-04-04T12:49:30.583 回答
1

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

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

实现这一点的一个非常简单的方法是使用ThreadPool类。它方便地为您管理队列和工作人员。您所需要的只是通过QueueUserWorkItem.

或者,如果您想使用 TPL 构造,您可以自己使用Tasks 和a 的组合来实现上述机制ConcurrentQueue

于 2012-04-04T12:23:11.213 回答