当线程用完时如何避免ThreadPool瓶颈

How to avoid ThreadPool bottleneck when it runs out of threads

我们有一个有时间限制的应用程序,假设我们需要每 500 毫秒执行一次操作,它是一种看门狗,所以如果我们在 500 毫秒之前不发送消息,就会发生不好的事情。

应用程序大量使用 ThreadPool,并且这个看门狗与 ThreadPool 交互。

我们发现在一些低端机器上,有时当我们排队一个新的工作项时,执行它需要大约 800 毫秒,因此看门狗会触发。我们猜测它与ThreadPool 运行 out of threads / creating new threads有关。

有没有办法避免这种情况,例如强制 ThreadPool 提前创建线程或在不同的线程中创建线程,这样看门狗就不必等到 ThreadPool 可以执行请求?

您可以尝试使用ThreadPool.SetMinThreads方法。

lawliet29的回复可以提供一定的帮助。 但即使有很多线程,线程池也可能变得饱和,一些任务可能会排在全局任务队列的末尾。

我们在 Akka.NET 内部有同样的问题,我们的系统参与者即使在重负载下也必须执行。

我们现在将那些敏感任务移到它自己的专用线程池中,这样这些任务就不会在全局池队列的末尾结束。

https://github.com/helios-io/DedicatedThreadPool

我们可以使用特殊的任务调度器将任务调度到这个队列中。