我在我的TaskParallel应用程序中的几个地方都有一个使用过的WCF库。在一个地方,我用它就像:
Place 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);
});在另一种方法中,我使用了这样的方法:
Place 2
System.Threading.Tasks.Task.Factory.StartNew(() => ProcessTransaction(objInput.Clone()));问题是两地之间的时间分配问题。也就是说,如果我调用了并行循环在Place 2处理数百条记录的方法,那么我位于Place 1的线程正在等待直到所有记录都处理完毕。我可以用什么时间分割处理呢?
我使用的任务并行库为.net 3.5从;
发布于 2015-09-16 11:46:22
问题是,您已经在位置1产生了许多任务,place 2现在排队了。位置1中的并行循环什么也不做,因为主体只启动一个非常快完成的任务。
也许,您应该将StartNew从place 1中删除,这样并行性的程度就会更低。我不确定这将完全消除任何问题,因为并行循环可能仍然充分利用所有可用的池线程。
无论如何,使用并行的IO是一种反模式,因为系统选择的DOP几乎总是一个糟糕的选择。TPL不知道如何有效地调度IO。
您可以使place 2成为一个LongRunning任务,这样它就不依赖于线程池,并且可以保证运行。
还可以使用异步IO进行调查,这样就不再依赖线程池了。
https://stackoverflow.com/questions/32607047
复制相似问题