为什么 ThreadPool 一次只启动一个线程?

Why ThreadPool start only one thread in time?

我完全按照书中所说的方式开始线程:

for (int i = 1; i <= 4; i++) {
  ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i);
}

ThreadMethod 看起来像:

static void ThreadMethod(object input) {
  Console.WriteLine(input + " thread started");
  //do some stuff for, like, 400 milliseconds
  Console.WriteLine(input + " thread completed");
}

由于某种原因,2 个线程仅在 1 个线程完成后才启动(此时所有工作都已完成,2-4 个线程只是启动并停止什么都不做)。

有什么问题吗?问任何可以帮助解决这个问题的东西。 我不使用任何同步 类.

如果有关系,我有 2 个核心处理器。

你的 ThreadMethod 跑得太快了。您的代码一切正常,除非您应该从 ThreadPool 切换到新的抽象,例如 Task.Run.

实际上,当我让 ThreadMethod 做更长的事情时,另一个线程在一段时间后启动,但它没有一次工作,只是从一个线程切换到另一个线程。看来我必须使用其他工具了。

TreadPool 有它可以使用的最大线程数。请参阅 ThreadPool.GetMaxThread 和 SetMaxThread。默认情况下它可能等于可用核心数。

对于 CPU 密集型工作,这是有道理的,因为使用比内核更多的线程实际上会降低性能。但是,对于 I/O 密集型作业等慢速作业,许多线程可以并行 运行 以避免阻塞并等待 I/O 完成。示例:一次从多个 FTP 服务器抓取多个文件。