任务并行库时间切片

本文关键字:切片 时间 并行 任务 | 更新日期: 2023-09-27 18:13:03

我在WCF应用程序的几个地方使用了TaskParallel库。在一个地方,我像这样使用它:

地方1

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 100 };
Parallel.ForEach(objList, options, recurringOrder =>
{
    Task.Factory.StartNew(() => ProcessSingleRequestForDebitOrder(recurringOrder));
    //var th = new Thread(() => ProcessSingleRequestForDebitOrder(recurringOrder)) { Priority = ThreadPriority.Normal };
    //th.Start();
    //ProcessSingleRequestForDebitOrder( recurringOrder);
});

在另一种方法中,我用过

地方2

System.Threading.Tasks.Task.Factory.StartNew(() => ProcessTransaction(objInput.Clone()));

问题是两个地方之间的时间切片。也就是说,如果我调用了并行循环在2处处理数百条记录的方法,我在1处的线程将等待所有记录处理完毕。有什么方法可以缩短处理时间吗?

我正在使用。net 3.5的任务并行库;

https://www.nuget.org/packages/TaskParallelLibrary/

任务并行库时间切片

问题是您已经在位置1生成了许多任务,而位置2现在正在排队。第1处的Parallel循环什么也不做,因为程序体只启动一个很快就完成的任务。

可能,您应该从位置1删除StartNew,以便并行度较低。我不确定这是否会完全消除任何问题,因为并行循环可能仍然会充分利用所有可用的池线程。

使用并行执行IO是一种反模式,因为系统选择的DOP几乎总是一个糟糕的选择。TPL不知道如何有效地调度IO。

您可以将2号位置设置为LongRunning任务,这样它就不依赖于线程池,并且可以保证运行。

你也可以研究使用异步IO,这样你就不再依赖线程池了。