当某些cpu时间可用时,我有几个低进度任务需要执行。如果其他更多导入任务正在运行,我不希望执行此任务。也就是说,如果正常/高优先级任务到来,我希望低重要性任务暂停,直到重要性任务完成。线程池中的C#低线程优先级
有一个相当大的低重要性任务要执行(50至1000)。所以我不想为每个任务创建一个线程。但是我相信线程池不允许一些优先级规范,是吗?
你会如何解决这个问题?
当某些cpu时间可用时,我有几个低进度任务需要执行。如果其他更多导入任务正在运行,我不希望执行此任务。也就是说,如果正常/高优先级任务到来,我希望低重要性任务暂停,直到重要性任务完成。线程池中的C#低线程优先级
有一个相当大的低重要性任务要执行(50至1000)。所以我不想为每个任务创建一个线程。但是我相信线程池不允许一些优先级规范,是吗?
你会如何解决这个问题?
您可以新建一个主题并使用Dispatcher发送它需要various priorities。
优先级有点以用户界面为中心,但这并不重要。
您不应该嘲笑常规ThreadPool
的优先级,因为您不是唯一的消费者。我认为合乎逻辑的方法是自己编写自己的程序 - 或许像生产者/消费者队列一样简单,使用自己的Thread
(s)作为消费者 - 自己设置线程优先级。
.NET 4.0包含新的库(TPL等),使所有这些变得更加容易 - 在此之前,您需要额外的代码来创建自定义线程池或工作队列。
当您在ThreadPool中使用构建时,所有线程都将使用默认优先级执行。如果你把这个设置搞乱了,它将被忽略。这是您应该推出自己的ThreadPool的情况。几年前,我扩展了SmartThreadPool以满足我的需求。这也可以让你满意。
我会创建一个暂挂任务对象的共享队列,每个对象指定其优先级。然后编写一个监视队列的调度程序线程,并为每个任务启动一个新线程,达到某个最大线程数限制,并在创建它时指定线程优先级。它只有少量工作要做,并且可以让调度程序报告活动,甚至可以动态调整正在运行的线程数。这个概念对我来说工作得非常好,如果你将你的队列作为一个数据库表,那么它可以被包装在一个windows服务中。
诀窍是,我不想根据他们的优先级开始任务,我希望他们在他们的优先考虑下执行。 (也就是说,如果高优先级的任务应该暂停,如果高优先级的任务应该暂停) – Toto 2009-10-16 15:05:11
注意:我正在使用3.5框架 – Toto 2009-10-16 15:06:29
然后,你必须寻找“优先队列C#” - 有很多,但我可以' t直接推荐任何特定的一个。我*怀疑* TPL将在发布时直接提供。 – 2009-10-16 15:18:04