ThreadPool没有立即启动新线程

Mat*_*ttW 4 c# multithreading console-application

我有一个C#Windows服务启动各种对象(类库).这些对象中的每一个都有自己的"处理"逻辑,通过使用它来启动多个长时间运行的处理线程ThreadPool.我有一个例子,就像这样:

System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(WorkerThread_Processing));
Run Code Online (Sandbox Code Playgroud)

这非常有效.我的应用程序没有任何问题,我的线程运行良好.

现在,对于回归测试,我启动了相同的对象,但是从C#Console应用程序而不是Windows服务.它调用相同的确切代码(因为它调用相同的对象),但是该WorkerThread_Processing方法在启动之前会延迟最多20秒.

我已经进入并从ThreadPoola 切换到a Thread,问题就消失了.这可能发生什么?我知道我没有超过MaxThreads计数(我最多开始20个线程).

Ada*_*son 15

ThreadPool特别打算长时间运行的项目(更具体地说,你甚至不需要启动新线程时使用ThreadPool,因为其目的是为了在线程的数量有限,传播的任务).

如果您的任务长时间运行,您应该将其分解为放在ThreadPool(或使用新Task框架)的逻辑部分,或者启动您自己的Thread对象.

至于为什么您遇到的延迟,将在MSDN文档ThreadPool说以下内容:

作为其线程管理策略的一部分,线程池在创建线程之前会延迟.因此,当许多任务在短时间内排队时,在所有任务开始之前可能会有很长的延迟.

您只知道ThreadPool尚未达到其最大线程数,而不是它实际上处于空闲状态的线程数(如果有).

  • 但是,如果池中存在(假设的)空闲线程,为什么会导致延迟?我同意这个结论,但是没有找到这个答案令人满意地回答了*为什么*. (3认同)
  • @pst:你不知道池中有剩余的自由线程,你知道`ThreadPool`还没有达到它的*最大*线程数.根据[MSDN Docs](http://msdn.microsoft.com/en-us/library/0ka9477y(v = vs.95).aspx),`ThreadPool`将延迟创建新线程,因此添加几个项目马上几乎可以保证延迟.看我的编辑.谢谢! (2认同)