c# - ThreadPool 没有立即启动新线程

标签 c# multithreading console-application

我有一个启动各种对象(类库)的 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/

相关文章:

java - 如何解释 Java 线程堆栈?

c - 暂停/恢复所有用户进程——这可能吗?

c# - ASP.NET 文本框中的 "<!"字符组合阻止回发

c# - 在关系数据库中保存任何类型的对象

c# - Bootstrap 、同步框架 2.1 - 先决条件

C# 方括号和大于/小于

java - 如何在应用程序运行时将多个 textView 更改为特定的日期和时间

c# - 部署 .NET C# 控制台应用程序

c# - 做每件事百分之几

c# - 从 MSTest Runner 或控制台应用程序的调试器下使用 PortableClassLibrary 类中的 ConfiguredTaskAwaitable 有什么问题?