如果我对 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();
}