C# 为什么线程睡眠会影响新任务的创建? private static void Main(字符串[]args) { 对于(int i=0;i { 睡眠(1000); Console.WriteLine(“hej”); 睡眠(10000); }); } Console.ReadLine(); }
为什么这个代码在一秒钟后不会打印1000次“hej”?为什么Thread.Sleep(10000)会对代码行为产生影响?有许多因素会改变结果 其中包括(但不限于):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
- 循环迭代的固有时间
- 线程池的大小
- 线程管理开销
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();
}