任务并行库时间切片

时间:2015-09-16 11:14:24

标签: c# .net-3.5 task-parallel-library task multitasking

我的TaskParallel应用程序中的几个地方都有一个用过的WCF库。 我在一个地方使用它:

放置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 个答案:

答案 0 :(得分:1)

问题是你已经产生了很多任务1,而地方2现在排队了。位置1中的并行循环没有任何作用,因为正文只能启动一个非常快速完成的任务。

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

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

您可以将地点2设为LongRunning任务,以使其不依赖于线程池并保证运行。

您还可以使用异步IO进行调查,以便不再依赖线程池。