我帮助了一个客户端,一个应用程序在一段时间后停止了它的工作(它最终开始再次工作)。
问题是当Task
失败时,它使用Thread.Sleep
5秒钟(在任务中)。由于每两秒排队最多可有800个任务,如果其中许多作业失败并调用Thread.Sleep
,您可以想象出问题。这些工作都没有标有TaskCreationOptions.LongRunning
。
我重写了这些任务,以便Thread.Sleep
(或Task.Delay
就此而言)不是必须的。
但是,我对{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
决定何时创建新线程。