gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:00 25 4
gpt4 key购买 nike

我在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com