为什么Thread.Sleep会影响新任务的创建?

时间:2014-10-01 12:09:25

标签: c# multithreading task threadpool

private static void Main(string[] args)
{
    for (int i = 0; i < 1000; i++)
    {
        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            Console.WriteLine("hej");
            Thread.Sleep(10000);
        });    
    }
    Console.ReadLine();
}

为什么这段代码不会打印1000次&#34; hej&#34;一秒钟后?为什么Thread.Sleep(10000)会对代码行为产生影响?

3 个答案:

答案 0 :(得分:7)

Factory.StartNew有效地将工作委托给ThreadPool

只要线程数小于或等于处理器数,Threadpool就会立即创建多个线程来响应请求。一旦达到处理器计数,线程池将立即停止创建新线程 。这是有道理的,因为创建多于处理器计数的线程数会引入线程调度开销并且不返回任何内容。

相反,它会限制线程的创建。它等待500毫秒,看看是否还有待处理的工作,没有线程来处理请求。如果有待处理的工作,它将引入一个新线程(只有一个)。只要你有足够的工作要做,这个过程就会继续。

当工作队列的流量被清除时,线程池将破坏线程。上面提到的过程一直在继续。

此外,线程池可以同时运行的线程数有max limit。如果你点击它,threadpool将停止创建更多线程并等待以前的工作项完成,这样它就可以重用现有的线程。

这不是故事的结局,这是令人费解的!这些是ThreadPool做出的一些决定。

我希望现在很清楚为什么你会看到你所看到的。

答案 1 :(得分:3)

有许多因素会改变结果。

有些(但不限于):

  • 循环迭代的固有时间
  • 线程池的大小
  • 线程管理开销

答案 2 :(得分:0)

您的代码行为方式是预期的行为。你等待1000毫秒来打印hej,打印完成后你会再执行Thread.sleep 10000毫秒。如果您想在一秒钟后打印1000次hej,请删除Thread.sleep(10000)