c# - 任务并行库时间分片

标签 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(() => 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()));

问题是两个地方之间的时间片。也就是说,如果我调用了并行循环正在 Place 2 处理数百条记录的方法,我在 Place 1 的线程正在等待所有记录都已处理。可以告诉我如何对处理进行时间分割吗?

我正在使用 .net 3.5 的任务并行库;

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

最佳答案

问题是您在位置 1 中生成了很多任务,而位置 2 现在正在排队。位置 1 中的并行循环什么也不做,因为正文只启动一项很快完成的任务。

可能,您应该从位置 1 中删除 StartNew 事物,以便降低并行度。我不确定这是否会完全消除任何问题,因为并行循环可能仍会充分利用所有可用的池线程。

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

你可以让地方 2 成为一个 LongRunning 任务,这样它就不会依赖于线程池并且保证运行。

您还可以研究使用异步 IO,这样您就不再依赖于线程池。

关于c# - 任务并行库时间分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32607047/

相关文章:

c# - 从 Linq 中的日期时间值提取周数到实体查询

c# - Microsoft Visual C++ 2010 SP1 可在 Azure 上重新分发吗?

c# - Async WebRequest 卡住应用程序

c# - 如何在 FtpWebRequest 中使用被动模式并修复 .Net 3.5 中的 PASV 错误并通过代码定义端口范围

WCF NetTCP 通过 Internet 绑定(bind)

c# - 使用 AsSequential 以保持顺序

c# - ASP.NET MVC 5 。异步等待。等待具有不同返回类型的任务

c# - 处于 ObjectStart 状态的 token StartObject 将导致无效的 JSON 对象。路径 '' 。”

c# - 我实现 IEnumerator 和 IEnumerable 的类不会转到 foreach 语句

c# - Visual Studio 没有生成代码来实例化自定义控件的实例