ThreadPool.QueueUserWorkItem对新线程

时间:2013-08-09 01:30:33

标签: c# multithreading threadpool

我有以下代码:

static void Main(string[] args)
{
    Console.Write("Press ENTER to start...");
    Console.ReadLine();

    Console.WriteLine("Scheduling work...");
    for (int i = 0; i < 1000; i++)
    {
        //ThreadPool.QueueUserWorkItem(_ =>
        new Thread(_ =>
            {
                Thread.Sleep(1000);
            }).Start();
    }
    Console.ReadLine();
}

根据Bart De Smet释放的教科书C#4.0(第1466页),使用新线程应该意味着使用的线程比使用我的代码中注释掉的ThreadPool.QueueUserWorkItem要多得多。 但是我已经尝试了两种,并且在资源监视器中看到“新线程”,大约分配了11个线程,但是当我使用ThreadPool.QueueUserWorkItem时,大约有50个。 为什么我会得到本书中提到的相反结果?

另外,为什么如果增加睡眠时间,在使用ThreadPool.QueueUserWorkItem时是否会分配更多线程?

1 个答案:

答案 0 :(得分:3)

new Thread()只创建一个Thread对象;你忘了打电话给Start()(它创建你在资源监视器中看到的实际线程)。

此外,如果您在睡眠完成后查看线程数,您将看不到任何已经退出的new Thread。 另一方面,ThreadPool将线程保持一段时间以便它可以重用它们,所以在这种情况下,即使在睡眠完成后你仍然可以看到线程。

使用new Thread(),您可能会看到数字保持在160左右,因为启动那么多线程需要一秒钟,因此在第161个线程启动时,第一个线程已经完成。如果你增加睡眠时间,你应该会看到更多的线程。

对于ThreadPool,它被设计为尽可能少地使用线程,同时保持CPU忙。理想情况下,繁忙线程的数量等于CPU核心的数量。但是,如果池检测到其线程当前未使用CPU(正在休眠或等待另一个线程),则会启动更多线程(速率为1 /秒,最高达到某个最大值)以保持CPU忙。