线程池不按预期使用线程?

时间:2014-06-07 10:01:08

标签: c# .net-4.0 threadpool

当我极度使用它的线程时,我正试图看看线程池会发生什么:

所以我运行这个测试:

void Main()
{ 
  int AvaliableWorker,AvaliableioCompletion,MaxWorker,MaxioCompletion;

  for (int i=0;i<1028;i++) Task.Factory.StartNew(()=>{Thread.Sleep(5000);});

  Thread.Sleep(2000); // give the loop some time to run threads....

  ThreadPool.GetAvailableThreads(out AvaliableWorker, out AvaliableioCompletion);
  Console.WriteLine("{0} / {1}", AvaliableWorker, AvaliableioCompletion);

  ThreadPool.GetMaxThreads(out MaxWorker, out MaxioCompletion); 
  Console.WriteLine("{0} / {1}", MaxWorker, MaxioCompletion); 

}

但是,当我在.net4/32bit环境(控制台)上运行它时,我会得到以下结果:

**1015** / 1000
1023 / 1000

再次跑步:

**1009** / 1000
1023 / 1000

问题在于粗体数字:

问题

Fw.4将默认的最大线程池工作线程创建设置为1023(如您所见)。

但是看GetAvailableThreads

enter image description here

如果是这样,为什么我仍然会获得像1015 , 1009 这样的大值,因为我会让1028个线程保持睡眠状态

我的意思是,1023-1028 = negative number :(换句话说:“我的朋友不再有线程了,我现在可以通过每秒2个线程按需创建它们 - 但是那是另一个不相关的主题

1 个答案:

答案 0 :(得分:2)

  

当我让1028个线程睡觉时?

你没有。你排队了大约1000个任务,而不是(还)线程。当WriteLine()结果时仍在等待运行。

此时池实际的线程数:1023 - 1015 = 8.

在for循环之后使Sleep()更长一点(秒),你会看到更少数量的可用线程,即更多的池线程。