首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务并行库时间切片

任务并行库时间切片
EN

Stack Overflow用户
提问于 2015-09-16 11:14:23
回答 1查看 246关注 0票数 2

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

Place 1

代码语言:javascript
复制
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

代码语言:javascript
复制
System.Threading.Tasks.Task.Factory.StartNew(() => ProcessTransaction(objInput.Clone()));

问题是两地之间的时间分配问题。也就是说,如果我调用了并行循环在Place 2处理数百条记录的方法,那么我位于Place 1的线程正在等待直到所有记录都处理完毕。我可以用什么时间分割处理呢?

我使用的任务并行库为.net 3.5从;

https://www.nuget.org/packages/TaskParallelLibrary/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 11:46:22

问题是,您已经在位置1产生了许多任务,place 2现在排队了。位置1中的并行循环什么也不做,因为主体只启动一个非常快完成的任务。

也许,您应该将StartNew从place 1中删除,这样并行性的程度就会更低。我不确定这将完全消除任何问题,因为并行循环可能仍然充分利用所有可用的池线程。

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

您可以使place 2成为一个LongRunning任务,这样它就不依赖于线程池,并且可以保证运行。

还可以使用异步IO进行调查,这样就不再依赖线程池了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32607047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档