【发布时间】:2013-01-09 00:39:24
【问题描述】:
如果我对 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();
}
【问题讨论】:
-
如果您使用的是 .NET Framework 4.0 或 4.5,则有一个轻量级库,即任务并行库。 TPL 让它变得简单轻量
-
如果我运行你的代码,我只会看到 0-4。也许这在 .Net 4.5 中有所改变?
标签: c# multithreading queue threadpool