我有一个启动各种对象(类库)的 C# Windows 服务。这些对象中的每一个都有自己的“处理”逻辑,通过使用 ThreadPool
启动多个长时间运行的处理线程。我有一个例子,就像这样:
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(WorkerThread_Processing));
这很好用。我的应用程序没有任何问题,我的线程运行良好。
现在,为了进行回归测试,我启动了这些相同的对象,但是是从 C# 控制台应用程序而不是 Windows 服务启动的。它调用完全相同的代码(因为它正在调用相同的对象),但是 WorkerThread_Processing
方法在启动前最多延迟 20 秒。
我已经进入并从 ThreadPool
切换到 Thread
,问题就消失了。这里会发生什么?我知道我没有超过 MaxThreads
计数(我最多开始 20 个线程)。
最佳答案
ThreadPool
特别不用于长时间运行的项目(更具体地说,当您使用 ThreadPool 时,您甚至不必启动新线程
,因为它的目的是将任务分散到有限数量的线程上)。
如果你的任务是长时间运行的,你应该将它分解成放在 ThreadPool
上的逻辑部分(或使用新的 Task
框架),或者旋转创建你自己的 Thread
对象。
至于您遇到延迟的原因,MSDN Documentation for the ThreadPool
class说如下:
As part of its thread management strategy, the thread pool delays before creating threads. Therefore, when a number of tasks are queued in a short period of time, there can be a significant delay before all the tasks are started.
您只知道ThreadPool
尚未达到其最大 线程数,而不知道它实际闲置的线程数(如果有的话)。
关于c# - ThreadPool 没有立即启动新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7600774/