我的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的任务并行库;
答案 0 :(得分:1)
问题是你已经产生了很多任务1,而地方2现在排队了。位置1中的并行循环没有任何作用,因为正文只能启动一个非常快速完成的任务。
您可能应该从第1位移除StartNew,以便并行度较低。我不确定这会完全消除任何问题,因为Parallel循环可能仍然完全利用所有可用的池线程。
无论如何,使用并行执行IO都是一种反模式,因为系统选择的DOP几乎总是一个糟糕的选择。 TPL不知道如何有效地安排IO。您可以将地点2设为LongRunning
任务,以使其不依赖于线程池并保证运行。
您还可以使用异步IO进行调查,以便不再依赖线程池。