任务并行库时间分片

Task parallel library time slicing

我在 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()));

问题是两个地方之间的时间片。也就是说,如果我调用了并行循环正在 Place 2 处理数百条记录的方法,我在 Place 1 的线程正在等待所有记录都已处理。可以告诉我如何对处理进行时间分割吗?

我正在使用来自 .net 3.5 的任务并行库;

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

问题是您在位置 1 中产生了很多任务,而位置 2 现在正在排队。位置 1 中的并行循环什么都不做,因为正文只启动一个很快完成的任务。

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

无论如何,使用 Parallel 进行 IO 是一种反模式,因为系统选择的 DOP 几乎总是一个糟糕的选择。 TPL 不知道如何有效地安排 IO。

你可以让地方2成为一个LongRunning任务,这样它就不会依赖于线程池并且保证运行。

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