【问题标题】:Number of available threads in threadpool线程池中的可用线程数
【发布时间】:2015-07-06 00:59:11
【问题描述】:

在线程池中,我设置了最大线程数。我希望有可用的工作线程数。我试过了。

     ThreadPool.GetAvailableThreads(out x, out y);

使用这个,我得到的可用线程数 (x) 只是在减少。即使在他们的任务完成后,可用线程数 (x) 也没有增加。 如何获取线程池中的实际可用线程数。

【问题讨论】:

  • 你想用这个完成什么?您通常不必更改这些设置。
  • 为什么你设置了最大线程数?如果您试图限制执行线程的数量,这根本无济于事。它只会确保您的应用程序在压力下挂起。存在线程池,因此您无需自己管理线程,并且如果不使用,不会花费任何费用。
  • @PanagiotisKanavos 在线程池中,我想要 5 个并行线程来执行一些任务,其中我有包含任务数的长队列。我想要的是,每当这 5 个线程中的任何线程空闲时,它都会从我的任务队列中取出一个新任务。我使用的是单独的任务队列而不是线程池队列,因为我想优先处理这些任务。高优先级任务将直接获得线程,低优先级将进入队列末尾。
  • @kaustubh93 - 这不是对池进行微观管理的理由。看看Parallel.ForEach(),也许 MaxDegreeOfParallelism=5。但先试试吧。
  • 你不能通过限制整个应用程序池来做到这一点。使用具有 DOP 限制的 ActionBlock(几乎完全按照您的要求执行)或 PLINQ,或者仅使用具有一定数量的读取任务的 ConcurrentQueue。虽然,我怀疑让 .NET 完成它的工作会比限制线程数量更好

标签: c# .net multithreading threadpool threadpoolexecutor


【解决方案1】:

GetAvailableThreads() 方法不会告诉您有多少线程,它会返回仍然可以创建多少额外线程。

来自 MSDN:

当GetAvailableThreads返回时,workerThreads指定的变量中包含了可以启动的额外工作线程数,

关于

即使在任务完成后,可用线程 (x) 的数量也没有增加。

你等了多久?池只会慢慢销毁空闲线程。

【讨论】:

  • 为什么要限制线程数?它不限制 执行 线程的数量,因此它不提供任何有用的限制。
猜你喜欢
  • 2019-01-29
  • 1970-01-01
  • 2011-07-11
  • 2018-07-24
  • 2016-09-29
  • 2018-10-02
  • 1970-01-01
  • 2019-12-29
相关资源
最近更新 更多