保证立即开始并行threads/tasks/whatever

Guarantee immediate start of parallel threads/tasks/whatever

我将使用 "Process" 来指代将要并行进行的工作,并使用 "enqueue" 来指代将用于启动该过程的任何过程(无论是Task.Run, ThreadPool.QUWI, new Thread() ...随便什么)。

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

我们在生成方面遇到问题,进程没有立即开始。

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

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

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

目前我们的实施开始使用 TP.QUWI,然后我们转向使用 Task.Run。 我们的初步调查引导我们使用 Threadpool 和使用 ThreadPool.SetMinThreads() 的 Thread-Creation-Strategy,因此我们正在追求这个角度,看看是否能完全解决问题。

但是,如果我们的目标是让进程在入队后立即启动,我们是否应该关注另一个change/approach?

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

似乎你想要的可以通过覆盖默认任务调度程序来实现....吓人...

You can't assume that all parallel tasks will immediately run. Depending on the current work load and system configuration, tasks might be scheduled to run one after another, or they might run at the same time. For more information about how tasks are scheduled, see the section, "The Default Task Scheduler," later in this chapter.

使用自定义计划创建任务

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

在某些情况下,您可能想要覆盖默认调度程序。最常见的情况发生在您希望您的任务在特定线程上下文中 运行 时... 其他情况发生在默认任务调度程序的负载平衡试探法不适用于您的应用程序时。有关详细信息,请参阅本章后面的 "Thread Injection," 部分。

除非您另外指定,否则任何新任务都将使用当前任务计划程序...

您可以实现自己的任务调度程序class。有关详细信息,请参阅本章后面的 "Writing a Custom Task Scheduler," 部分。

线程注入

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

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