任务并行库时间切片
本文关键字:切片 时间 并行 任务 | 更新日期: 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,这样你就不再依赖线程池了。