TPL如何知道线程是否要求更多工作?

时间:2011-07-06 16:32:44

标签: c# .net task-parallel-library

我正在开发一个项目来处理并行运行的一些任务。

要处理的任务数量通常约为200,而那些可以并行的任务数量约为10

我正在考虑使用TPL,因为它简化了很多细节,因为它提供了一种通过自定义TaskScheduler来控制并发度的方法。

然而,我也试图找到一个很好的功能,让我知道一个特定的线程要求更多的工作,并且ThreadPool的队列是空的,它没有任何更多的工作从其他线程窃取。

可以这样做吗?

编辑1 我第一次不清楚。每次我只能将大约50个任务排队到ThreadPool,我们不想等到整个50个项目都完成处理。

2 个答案:

答案 0 :(得分:3)

  

然而,我也试图找到一个很好的功能,让我知道一个特定的线程要求更多的工作,并且ThreadPool的队列是空的,它没有任何更多的工作从其他线程窃取。

不幸的是,ThreadPool的内部工作原理并未公开。没有办法挂钩这些具体信息。

话虽如此,ThreadPool作为单个内聚单元工作 - 本地工作队列实际上只在单个线程池线程启动新任务时才有意义,因为新任务被添加到该线程的本地工作队列。 “ThreadPool的队列是空的,它没有任何工作可以从其他线程窃取”只会在整个ThreadPool完成处理时发生,如果你是添加工作的那个,那么一旦全部完成,就会发生你的工作已经完成。这很容易检查......


编辑:

  

我第一次不清楚。每次我只能将大约50个任务排队到ThreadPool,我们不想等到整个50个项目都完成处理。

如果您正在使用TPL,则可以将整个工作负载排队。通过使用自定义TaskScheduler(甚至是默认值,它只依赖于ThreadPool的池),您将自动获得资源池,从而防止一次处理太多工作项。随着您的工作量加工,更多项目将自动安排......

答案 1 :(得分:2)

为什么不为每个任务创建一个Task,然后全部启动它们? TPL应该自动确定一次调度到线程池的数量(它们不会全部同时运行并占用所有资源 - 它会将多个任务调度到线程池中,然后按照早期调度更多完成)。