Threading/TPL etc
本文关键字:etc TPL Threading | 更新日期: 2023-09-27 18:30:02
我需要处理1600万条数据库记录,这将花费我很长时间。我不懂穿线,所以我想在这里问一下。我的想法是,我需要执行以下操作,但不确定如何执行:
- 获取我的1600万记录
- 把它们分成若干"块"
- 发送这些块中的每一个,以便在其线程上进行处理
这听起来对吗?我该如何分配我的工作量(1600万张唱片)等等。。。?
如果你能提供合理的建议,请干杯。
如果您想并行处理一个项目集合,Parallel.Foreach()
就是这样做的。你只需要给它传递一个你想为每个项目执行的操作(可能是作为lambda),它会负责将你的集合分割成块并执行它
但你必须小心你在行动中投入了什么。这是因为代码将在更多的线程上同时执行,所以您不应该以线程不安全的方式访问任何共享状态。
我建议您以以下方式使用众所周知的生产者-消费者模式:
- 单个线程(生产者)从数据库中提取记录,创建任务(需要处理单个或多个记录),并将它们放入共享队列中
- 一组线程(使用者)从队列中提取任务并并行处理它们
实现这一点的一种非常简单的方法是使用ThreadPool
类。它为您方便地管理队列和工作人员。您所需要的只是通过QueueUserWorkItem
实现生产者和队列任务。
或者,如果您想使用TPL构造,您可以使用Task
和ConcurrentQueue
的组合来自己实现上述机制。