繁体   English   中英

使用Task时,如果ThreadPool忙/闲会怎样?

[英]When using Task what happens if the ThreadPool is full/busy?

当我使用使用ThreadPool的.Net 4 Task类时,如果所有线程都忙怎么办?

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

在.NET4.0 32位系统上,ThreadPool中的最大线程数设置为大约1000个线程。 对于.NET的较早版本而言,它要少得多。 如果您有1000个线程在运行,则说它们由于某种原因在阻塞,当您将第1001个任务排队时,它将永远不会执行。

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

您可以通过调用ThreadPool.SetMaxThreads方法来更改ThreadPool可以使用的ThreadPool.SetMaxThreads 但是,如果你希望使用多个线程,你有你的代码大得多的问题。 建议您弄乱这样的ThreadPool配置。 您很可能会获得更差的性能。

请记住TaskThreadPool.QueueUserWorkItem ,完成后将重新使用线程。 如果您创建任务或将线程池线程排队,则它可能会可能不会创建新线程来执行您的代码。 如果池中已经有可用线程,它将重新使用其中一个而不是创建(昂贵的)新线程。 仅当您正在任务中执行的方法永不返回时,才需要担心线程用完,但是就像我说的那样,这是代码的完全不同的问题。

默认情况下,ThreadPool的MaxThreads很高。 通常,您永远都无法到达那里,您的应用程序将首先崩溃。

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

不会增加MaxThreads。 当任务多于可用工作线程时,某些任务将排队等待,直到线程池提供可用线程为止。 它可以做一些相当高级的工作,以扩展具有大量内核的功能(工作窃取,线程注入等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM