C# parallel.foreach 急需数据

C# parallel.foreach starving for data

我的应用程序处理数百万条大小不一的数据。小对象处理得很快,而其他对象可能需要十五分钟以上。

我当前的代码:

List<QueueRecords> queueRecords= Get500QueueRecords();
bool morefiles=true;
while(morefiles)
{
    Parallel.ForEach(
    queueRecords,parallelOptions,(record,loopstate)=>
    {
    //dowork
    }
    queueRecords = Get500QueueRecords();
    if(queueRecords.Count() == 0)
    {
    morefiles = false;
    }
}

这样做的问题是,很多时候我会以一个线程执行较长的 运行 任务而告终,同时仍有大量数据需要处理。

我应该研究哪种模式来解决这个问题?

问题: 1) Get500QueueRecords 也可能需要一些时间来执行,在此期间您没有进行任何处理; 2) 如果一组中的最后一条记录需要 15 分钟,您在处理时一次只处理一条记录,因为 ParallelForEach 将等待它完成。

您真的应该看看 TPL DataFlow (https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/dataflow-task-parallel-library) 或至少创建一个 reader 任务,将数据泵入 BlockingCollection<T>,然后启动多个 reader 任务从阻塞集合中提取直到被消耗。

使用生产者和消费者之间的有限大小 BlockingCollection<T> 允许您控制 (i) 从 reader 任务中缓冲了多少项目,以及 (ii) 您有多少任务吃了它。