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

Mis*_*tyK 4 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Sri*_*vel 8

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

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

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

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

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

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

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