保证并行线程/任务/即时启动

时间:2016-05-11 13:44:53

标签: c# multithreading parallel-processing task-parallel-library threadpool

我将使用“Process”来引用将要并行发生的工作,并使用“enqueue”来引用将用于启动该进程的任何进程(无论是Task.Run,​​ThreadPool。 QUWI,新的Thread()......无论如何)。

我们有一个性能敏感的程序,它产生多个并行进程来收集数据。

我们遇到了产卵问题,这些过程并非立即开始。

具体来说,如果我们准备一个进程,启动一个计时器,将进程排入队列,并将计时器检查为进程中的第一个动作...然后我们看到时间延迟偶尔会延伸到100s甚至1000s毫秒

鉴于该过程本身应该只运行3-10秒,在入队和激活过程之间有2秒的延迟是一个主要问题。

= - = - = - = - = - = - = - = - = - = - = - = - = - = - =

目前我们的实现开始使用TP.QUWI,然后我们转向使用Task.Run。 我们的初步调查引导我们使用Threadpool使用的线程创建策略并使用ThreadPool.SetMinThreads(),因此我们正在追求这个角度,看看是否能彻底解决问题。

但是,如果我们的目标是在排队后立即开始 ,那么我们应该考虑另一种变化/方法吗?

1 个答案:

答案 0 :(得分:1)

Taken from here(我强烈建议您阅读):

好像你想要的东西可以通过覆盖默认的任务调度程序来实现.... scarey ......

  

您不能假设所有并行任务都会立即运行。根据当前的工作负载和系统配置,可能会安排任务一个接一个地运行,或者它们可能同时运行。有关如何安排任务的更多信息,请参阅"默认任务计划程序部分,"本章稍后部分。

使用自定义计划创建任务

您可以通过任务工厂方法使用的覆盖默认任务计划程序来自定义.NET中的任务的详细信息。例如,您可以提供自定义任务调度程序作为TaskFactory.StartNew方法的重载版本之一的参数。

在某些情况下,您可能希望覆盖默认调度程序。当您希望任务在特定线程上下文中运行时,最常见的情况发生...当默认任务调度程序的负载平衡启发式方法不适合您的应用程序时,会出现其他情况。有关详细信息,请参阅“#34;线程注入”部分,"本章稍后部分。

除非另有说明,否则任何新任务都将使用当前的任务调度程序......

您可以实现自己的任务计划程序类。有关详细信息,请参阅"编写自定义任务计划程序部分,"本章稍后部分。

线程注入

.NET线程池自动管理池中的工作线程数...

阅读this SO post "replacing the task scheduler in c sharp with a custom built one"