当我极度使用它的线程时,我正试图看看线程池会发生什么:
所以我运行这个测试:
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
:
如果是这样,为什么我仍然会获得像1015 , 1009
这样的大值,因为我会让1028个线程保持睡眠状态?
我的意思是,1023-1028 = negative number
:(换句话说:“我的朋友不再有线程了,我现在可以通过每秒2个线程按需创建它们 - 但是那是另一个不相关的主题)
答案 0 :(得分:2)
当我让1028个线程睡觉时?
你没有。你排队了大约1000个任务,而不是(还)线程。当WriteLine()结果时仍在等待运行。
此时池实际的线程数:1023 - 1015 = 8.
在for循环之后使Sleep()更长一点(秒),你会看到更少数量的可用线程,即更多的池线程。