【问题标题】:How to TPL determine the number of threads to use?如何 TPL 确定要使用的线程数?
【发布时间】:2013-07-05 17:08:27
【问题描述】:

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

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

我重写了这些任务,这样Thread.Sleep(或Task.Delay)就不是必要的了。

但是,我对 TaskScheduler(默认值)在这种情况下的作用感兴趣。它如何以及何时增加线程数?

【问题讨论】:

  • 如果您可以使用await Task.Delay(),那将解决您的问题。
  • @svick:我已经解决了这个问题。这不是问题

标签: c# task-parallel-library


【解决方案1】:

根据MSDN

在幕后,任务排队到线程池,线程池已经 通过确定和确定的算法(如爬山)增强 调整使吞吐量最大化的线程数。

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

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

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

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

【讨论】:

  • TPL 不使用所有线程池线程,因为这会使所有其他线程池用户饿死。我对决定何时以及如何招募新线程的默认任务调度程序算法感兴趣。
  • 查看默认任务计划程序的编辑。除非您使用 LongRunning 选项,否则它使用 ThreadPool。我强烈建议在调试时使用“线程”窗口来监控实际发生的情况。
  • 是的,但它不会将所有任务直接放在不同的线程池线程中,但也可以将任务排队。我想知道它何时决定使用线程池以及何时将任务排队。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
相关资源
最近更新 更多