Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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# 使用任务时,如果线程池已满/忙,会发生什么情况?_C#_.net_Asynchronous_Task Parallel Library - Fatal编程技术网

C# 使用任务时,如果线程池已满/忙,会发生什么情况?

C# 使用任务时,如果线程池已满/忙,会发生什么情况?,c#,.net,asynchronous,task-parallel-library,C#,.net,Asynchronous,Task Parallel Library,当我使用使用ThreadPool的.NET4任务类时,如果所有线程都很忙,会发生什么 TaskScheduler是创建新线程并扩展线程池的最大线程数,还是等待线程可用?默认情况下,线程池的最大线程数非常高。通常情况下,你永远都无法到达那里,你的应用程序会先崩溃 因此,当所有线程都很忙时,新任务将缓慢地排队,最多每500毫秒1个,TP将分配新线程 它不会增加MaxThreads。当任务多于可用工作线程时,某些任务将排队等待,直到线程池提供可用线程。它做了一些非常高级的事情来扩展大量内核(工作窃取、

当我使用使用ThreadPool的.NET4任务类时,如果所有线程都很忙,会发生什么


TaskScheduler是创建新线程并扩展线程池的最大线程数,还是等待线程可用?

默认情况下,线程池的最大线程数非常高。通常情况下,你永远都无法到达那里,你的应用程序会先崩溃


因此,当所有线程都很忙时,新任务将缓慢地排队,最多每500毫秒1个,TP将分配新线程

它不会增加MaxThreads。当任务多于可用工作线程时,某些任务将排队等待,直到线程池提供可用线程。它做了一些非常高级的事情来扩展大量内核(工作窃取、线程注入等)。

在.NET4.0 32位系统上,线程池中的最大线程数设置为1000个左右。对于较旧版本的.NET来说,这一点更少。如果你有1000个线程在运行,比如说它们由于某种原因阻塞了,当你将1001个任务排队时,它将永远不会执行

在32位进程中,永远不会达到最大线程数。请记住,每个线程至少占用1MB内存(这是用户模式堆栈的大小)以及任何其他开销。加载的CLR和本机DLL已经丢失了大量内存,因此在使用这么多线程之前,您会遇到OutOfMemoryException

通过调用方法,可以更改线程池可以使用的线程数。然而,如果您希望使用那么多线程,那么您的代码就有一个更大的问题。我不建议您这样乱弄线程池配置。你很可能会表现得更差


请记住
Task
ThreadPool.QueueUserWorkItem
,线程完成后会被重复使用。如果创建任务或将线程池线程排入队列,则它可能会也可能不会创建新线程来执行代码。如果池中已有可用线程,它将重新使用其中一个线程,而不是创建(昂贵的)新线程。只有当您在任务中执行的方法永远不会返回时,才应该担心线程耗尽,但正如我所说,这是代码的一个完全不同的问题。

调用它不会增加MaxThreads。它肯定会产生一些新的线程。我假设,如果其中一个线程未运行,1001线程将排队并执行-blocks@Jon,没错。好吧,在32位系统上,你不可能在没有内存耗尽的情况下执行1000个线程,但是,是的,假设没有发生这种情况,当线程被释放时,该线程最终会运行。不感兴趣的是,64位系统上的线程池数是多少?线程池是系统范围还是应用程序范围?@Jon-For.NET4.0,是32767。在.NET3.5中,x86和x64都有大约500个线程。线程池是应用程序范围的。要澄清.Net 4 32位=1000和.Net 4 64位32767?如果应用程序范围广泛,每个应用程序是否有1000个线程?