2009-10-16 104 views
5

当某些cpu时间可用时,我有几个低进度任务需要执行。如果其他更多导入任务正在运行,我不希望执行此任务。也就是说,如果正常/高优先级任务到来,我希望低重要性任务暂停,直到重要性任务完成。线程池中的C#低线程优先级

有一个相当大的低重要性任务要执行(50至1000)。所以我不想为每个任务创建一个线程。但是我相信线程池不允许一些优先级规范,是吗?

你会如何解决这个问题?

回答

2

您可以新建一个主题并使用Dispatcher发送它需要various priorities

优先级有点以用户界面为中心,但这并不重要。

2

您不应该嘲笑常规ThreadPool的优先级,因为您不是唯一的消费者。我认为合乎逻辑的方法是自己编写自己的程序 - 或许像生产者/消费者队列一样简单,使用自己的Thread(s)作为消费者 - 自己设置线程优先级。

.NET 4.0包含新的库(TPL等),使所有这些变得更加容易 - 在此之前,您需要额外的代码来创建自定义线程池或工作队列。

+0

诀窍是,我不想根据他们的优先级开始任务,我希望他们在他们的优先考虑下执行。 (也就是说,如果高优先级的任务应该暂停,如果高优先级的任务应该暂停) – Toto 2009-10-16 15:05:11

+0

注意:我正在使用3.5框架 – Toto 2009-10-16 15:06:29

+0

然后,你必须寻找“优先队列C#” - 有很多,但我可以' t直接推荐任何特定的一个。我*怀疑* TPL将在发布时直接提供。 – 2009-10-16 15:18:04

2

当您在ThreadPool中使用构建时,所有线程都将使用默认优先级执行。如果你把这个设置搞乱了,它将被忽略。这是您应该推出自己的ThreadPool的情况。几年前,我扩展了SmartThreadPool以满足我的需求。这也可以让你满意。

0

我会创建一个暂挂任务对象的共享队列,每个对象指定其优先级。然后编写一个监视队列的调度程序线程,并为每个任务启动一个新线程,达到某个最大线程数限制,并在创建它时指定线程优先级。它只有少量工作要做,并且可以让调度程序报告活动,甚至可以动态调整正在运行的线程数。这个概念对我来说工作得非常好,如果你将你的队列作为一个数据库表,那么它可以被包装在一个windows服务中。