Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么线程睡眠会影响新任务的创建? private static void Main(字符串[]args) { 对于(int i=0;i { 睡眠(1000); Console.WriteLine(“hej”); 睡眠(10000); }); } Console.ReadLine(); }_C#_Multithreading_Task_Threadpool - Fatal编程技术网

C# 为什么线程睡眠会影响新任务的创建? private static void Main(字符串[]args) { 对于(int i=0;i { 睡眠(1000); Console.WriteLine(“hej”); 睡眠(10000); }); } Console.ReadLine(); }

C# 为什么线程睡眠会影响新任务的创建? private static void Main(字符串[]args) { 对于(int i=0;i { 睡眠(1000); Console.WriteLine(“hej”); 睡眠(10000); }); } Console.ReadLine(); },c#,multithreading,task,threadpool,C#,Multithreading,Task,Threadpool,为什么这个代码在一秒钟后不会打印1000次“hej”?为什么Thread.Sleep(10000)会对代码行为产生影响?有许多因素会改变结果 其中包括(但不限于): 循环迭代的固有时间 线程池的大小 线程管理开销 您编写代码的行为方式是预期行为。打印hej需要等待1000毫秒,打印后再执行Thread.sleep操作10000毫秒。如果要在一秒钟后打印1000次hej,请删除Thread.sleep(10000) 工厂。StartNew有效地将工作委托给线程池 只要线程数小于或等于处理器数,T

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

有许多因素会改变结果

其中包括(但不限于):

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

您编写代码的行为方式是预期行为。打印hej需要等待1000毫秒,打印后再执行Thread.sleep操作10000毫秒。如果要在一秒钟后打印1000次hej,请删除
Thread.sleep(10000)

工厂。StartNew
有效地将工作委托给
线程池

只要线程数小于或等于处理器数,Threadpool将立即创建线程数以响应请求。一旦达到处理器计数,threadpool将立即停止创建新线程。这是有道理的,因为创建的线程数超过处理器计数会带来线程调度开销,并且不会返回任何结果

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

当工作队列的流量被清除时,线程池将销毁线程。上述过程仍在继续

另外,threadpool可以同时运行的线程数量也有限制。如果点击该按钮,threadpool将停止创建更多线程,并等待以前的工作项完成,以便可以重用现有线程

这还不是故事的结尾,它是令人费解的!这是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();
}