为什么ThreadPool只能及时启动一个线程?

时间:2015-03-07 13:27:14

标签: c# multithreading threadpool

我开始的话就像书上说的那样:

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个核心处理器。

3 个答案:

答案 0 :(得分:2)

你的ThreadMethod跑得太快了。除了可能,您应该从ThreadPool切换到Task.Run之类的新抽象。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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