3

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

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

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

但是,我对TaskScheduler(默认)在那种情况下做了什么感兴趣。它如何以及何时增加线程数?

4

1 回答 1

2

根据MSDN

在幕后,任务排队到线程池,该线程池已通过算法(如爬山)进行了增强,该算法可确定并调整线程数以最大限度地提高吞吐量。

ThreadPool的最大线程数取决于环境。当您创建更多Tasks 时,池可以同时运行它们,直到达到其最大线程数,此时任何进一步的任务都将排队。

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

如果您想更好地了解应用程序在运行时发生的情况,您可以通过转到 Debug -> Windows -> Threads 来使用Visual Studio 的线程窗口(该条目只会在您调试时出现,因此您需要首先在您的应用程序中设置断点)。

这篇文章可能很有趣。除非使用TaskCreationOptions.LongRunning. 这意味着由ThreadPool决定何时创建新线程。

于 2013-07-05T08:31:22.063 回答