Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务并行库时间切片_C#_.net 3.5_Task Parallel Library_Task_Multitasking - Fatal编程技术网

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方法或并行循环选项。查看文档。