2011-07-06 69 views
2

我正在处理一个处理并行运行的几个任务的项目。TPL如何知道线程是否需要更多工作?

要处理的任务的数目通常为〜200和那些的,可以是平行的为约10

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

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

可以这样做吗?

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

+0

你想用这些信息做什么? –

+0

对不起,我不清楚我编辑了这个问题,以便它可能很清楚。 – logik6

+0

如果你打算自己做计划,你为什么使用线程池? –

回答

3

不过,我也想找到一个不错的功能,可以让我知道某个特定线程要求更多的工作和线程池的队列是空的,它没有任何更多的工作,从偷其他线程。

不幸的是,ThreadPool的内部工作原理并未公开公开。没有办法挂钩到这个特定的信息。

这就是说,ThreadPool作为一个单一的内聚单元工作 - 当单个线程池线程启动一个新的Task时,本地工作队列真的很重要,因为新任务被添加到该线程的本地工作队列中。 “ThreadPool的队列是空的,并且没有任何工作要从其他线程中窃取”,只有当整个ThreadPool完成处理时才会发生,如果你是添加工作的人,只要所有你的工作已经完成。这是很容易检查...


编辑:

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

如果您使用TPL,则可以将整个工作负载排队。通过使用自定义的TaskScheduler(或者甚至是仅依赖于ThreadPool池的默认设置),您将自动获取资源池,从而防止一次处理太多的工作项。随着工作量的增加,更多的项目会自动计划...

2

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

相关问题