Threading/TPL etc

本文关键字:etc TPL Threading | 更新日期: 2023-09-27 18:30:02

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

  1. 获取我的1600万记录
  2. 把它们分成若干"块"
  3. 发送这些块中的每一个,以便在其线程上进行处理

这听起来对吗?我该如何分配我的工作量(1600万张唱片)等等。。。?

如果你能提供合理的建议,请干杯。

Threading/TPL etc

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

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

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

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

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

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