C# 任务并行库时间切片
我在我的C# 任务并行库时间切片,c#,.net-3.5,task-parallel-library,task,multitasking,C#,.net 3.5,Task Parallel Library,Task,Multitasking,我在我的WCF应用程序的几个地方有一个使用过的TaskParallel库。 在一个地方,我使用它的方式如下: 排名1 var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 100 }; Parallel.ForEach(objList, options, recurringOrder => { Task.Factory.StartNew(() => P
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的线程将等待所有记录处理完毕。我能告诉你我怎样才能在处理过程中划分时间吗
我正在使用.NET3.5的任务并行库,来自
问题是,您在位置1生成了许多任务,而位置2现在已排队。位置1中的并行循环不起任何作用,因为主体只启动一个非常快完成的任务 也许,您应该从位置1中删除StartNew,以便降低并行度。我不确定这是否会完全消除任何问题,因为并行循环可能仍然会充分利用所有可用的池线程 用并行方式进行IO无论如何都是一种反模式,因为系统选择DOP几乎总是一个糟糕的选择。TPL不知道如何有效地安排IO 您可以将Place2设置为一个
LongRunning
任务,这样它就不依赖于线程池,并且保证可以运行
您还可以研究使用异步IO,以便不再依赖线程池。不确定为什么要并行启动任务,您是在多个线程上启动线程。@BenRobinson!在位置1,我在任务并行循环中启动任务,在位置2,我通过使用Task.Factory.StartNewBut Task Parallel Loop body启动线程,但任务并行循环体实际上是一个任务,因此仅在内部启动新任务毫无意义。Ok。我的想法是这里是ProcessSingleRequestForDebitOrder(recurringOrder)之间的区别;或者如果我写的话,你可以看到注释过的代码。Task.Factory.StartNew(()=>ProcessSingleRequestForDebitOrder(recurringOrder));谢谢usr。我还可以限制在位置1生成的并行任务的最大数量。也就是说,当我们安排了1000个任务时,它将等待这些任务空闲以进行新的处理。我尝试了与您提到的在Place2plink上长距离跑步完全相同的方法,它支持精确的DOP设置。使用PLINQ并通过实验确定最佳DOP。平行线不支持这一点是不必要的,也是可悲的。你这里所说的IO是什么意思。我的方法只是做一些数据库更新或调用其他WCF服务e.t.c.Ok意味着简单的处理。你能帮我把第一位的任务限制在不超过一定数量吗?我现在也在检查如何在我的案例中获得并行Linq的优势。感谢使用PLINQ的WithDegreeOfParallelism方法或并行循环选项。查看文档。