1

我有以下代码:

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 Unleashed(第 1466 页),使用新线程应该意味着使用比使用我的代码中注释掉的 ThreadPool.QueueUserWorkItem 更多的线程。但是我已经尝试了这两种方法,并且在资源监视器中看到使用“新线程”,大约分配了 11 个线程,但是当我使用 ThreadPool.QueueUserWorkItem 时,大约有 50 个。为什么我得到的结果与所提到的相反在这本书里?

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

4

1 回答 1

3

new Thread()只是创建一个 Thread 对象;您忘记调用Start()(这会创建您在资源监视器中看到的实际线程)。

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

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

至于ThreadPool,它旨在使用尽可能少的线程,同时保持 CPU 繁忙。理想情况下,繁忙线程的数量等于 CPU 内核的数量。但是,如果池检测到它的线程当前没有使用 CPU(正在休眠或等待另一个线程),它会启动更多线程(以 1/秒的速率,最多达到某个最大值)以保持 CPU 忙碌。

于 2013-08-09T01:37:13.570 回答