线程池中任务的优先级在.net中可能吗?
本文关键字:net 优先级 任务 线程 | 更新日期: 2023-09-27 18:05:08
线程池中的任务优先级在。net中是可能的吗?
我有一份……很多. .Actions
。我想在线程池中运行它们。但是。我要做的是设置线程池,所以它是这样工作的:
- 给予第一个动作/任务最高优先级-只关注第一个任务。
- 剩余任务优先级最低。
- 当第一个任务完成后,将最高优先级设置为第二个任务。
- 当第二个任务完成后,将最高优先级设置为第三个任务,以此类推。
这就像你想从种子文件中下载整季的电视节目(我不推荐),然后尽快开始观看。
我可以像这样设置一个线程池吗?或者有比线程池更好的解决方案吗?
我试着做了很多解决方案,但每件事都"太手动"。比如,在ThreadPool
旁边运行单独的Task.Factory.StartNew
线程。或者只通过Task.Factory.StartNew
运行线程。
编辑:好吧,看看第一个评论,也许我说得不够清楚。我的单个任务/动作是多线程的。它需要3-4个线程。在一个同步队列中运行100,000个这样的任务是没有意义的,因为我一次只使用3-4个线程。我想做的是:(好吧,假设我们有一个队列)队列中的第一个任务得到了它想要的一切(最多4个线程,对吧?)…我仍然有4个空闲线程(或更多,取决于机器)。我不想浪费它们,所以我想在那里运行其他任务……这很疯狂吗?
EDIT2: 现在我只使用一个线程池。真的很糟糕。我有8核cpu。我开始做40个任务只是为了测试。它几乎一次计算40个……这意味着,对于第一个结果,我需要等待10分钟(它是30秒/任务运行同步)
线程池是专门为线程的回收而设计的,因此改变优先级会干扰这一原则。
然而,在处理任务时,你可以通过在自定义的TaskScheduler
Windows支持7种相对线程优先级:空闲、最低、低于正常、正常、高于正常、最高和时间关键。
高层方法-
- 通过扩展
TaskScheduler
创建自定义TaskScheduler
。 这里的关键是 -
Task.Factory.StartNew
将使用这个自定义TaskScheduler
来执行任务。
TaskScheduler
将使用一个单独的线程(具有您想要的优先级)来处理排队的任务为100,000个任务分配剩余的4个线程似乎效率低下,特别是当您希望在第一个任务完成后匆忙执行第二个任务时。为什么不做点别的呢——为第一个任务分配4个线程,为第二个任务分配4个线程,以此类推,直到cpu用完。一旦一个任务完成,为队列中的下一个任务分配线程。