如何TPL确定要使用的线程数?

时间:2013-07-05 07:14:32

标签: c# task-parallel-library

我帮助了一个客户端,一个应用程序在一段时间后停止了它的工作(它最终开始再次工作)。

问题是当Task失败时,它使用Thread.Sleep 5秒钟(在任务中)。由于每两秒排队最多可有800个任务,如果其中许多作业失败并调用Thread.Sleep,您可以想象出问题。这些工作都没有标有TaskCreationOptions.LongRunning

我重写了这些任务,以便Thread.Sleep(或Task.Delay就此而言)不是必须的。

但是,我对{1}}(默认)在该场景中的作用感兴趣。如何以及何时增加线程数?

1 个答案:

答案 0 :(得分:2)

根据MSDN

  

在幕后,任务排队到ThreadPool,一直是   增强了算法(如爬山),确定和   调整到最大化吞吐量的线程数。

ThreadPool将拥有最大线程数,具体取决于环境。当您创建更多Task时,池可以同时运行它们,直到达到其最大线程数,此时任何其他任务将排队。

如果你想找出你可以使用System.Threading.ThreadPool.GetMaxThreads的最大ThreadPool个线程数(你需要传入两个int参数,一个将填充最大工作线程数的一个另一个将填充最大数量的异步I / O线程。)

如果您希望在运行时更好地了解应用程序中发生的情况,可以使用Visual Studio's threads window转到Debug - > Windows - >线程(该条目仅在您进行调试时才存在,因此您需要先在应用程序中设置断点)。

This post可能很有意思。除非你使用TaskCreationOptions.LongRunning,否则default task scheduler似乎只是将任务排队到ThreadPool的队列中。这意味着由ThreadPool决定何时创建新线程。