如果我的理解关于ThreadPool的工作方式是正确的,那么其目的之一就是限制在给定时间内可以创建的进程中的工作线程数。例如,如果您将MaxThreads设置为5并调用QueueUserWorkItem 30次,则会向ThreadPool发出30个请求,但只有其中的5个请求将由一个新线程服务,而其他25个请求将被添加到队列中,并在以前的请求完成并且现有线程可用时一个接一个地服务。
然而,在下面的代码中,对Thread.Sleep(-1)的调用保证了DoSomething()方法永远不会返回,这意味着当前线程永远不会对后续请求可用。
但是,我的对ThreadPool工作方式的理解可能是不正确的,因为如果它是正确的,那么下面的代码只应该打印数字0-4,而不是0-29。
请问有人能解释一下ThreadPool的工作原理,并说明下面的代码为什么不能做我认为它应该做的事情吗?
static void DoSomething(object n)
{
Console.WriteLine(n);
Thread.Sleep(-1);
}
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(5, 5);
for (int x = 0; x < 30; x++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), x);
}
Console.Read();
}