是否可以在.NET中对Threadpool中的任务进行优先级排序?

时间:2016-09-01 19:27:48

标签: c# .net multithreading performance threadpool

在.NET中可以确定Threadpool中任务的优先级吗?

我有一个......很多.. Actions的列表。我想在threadpool中运行它们..但是。 我正在尝试做的是设置线程池,所以它以这种方式工作:

  1. 将第一个操作/任务赋予最高优先级 - 仅关注第一个任务。
  2. 其余任务将获得最低优先级。
  3. 第一个任务完成后,将最高优先级设置为第二个任务。
  4. 当第二个完成时,将最高优先级设置为第三个任务等。
  5. 就像你想从种子(我不推荐)下载整个电视节目的季节,并尽快开始观看。

    我可以设置这样的线程池吗?或者是否有比threadpool更好的解决方案?

    我试图做很多解决方案,但一切都“过于手动”。比如,在Task.Factory.StartNew旁边运行单独的ThreadPool线程。或者仅通过Task.Factory.StartNew运行线程。

    编辑: 好的,看看这里的第一条评论,也许我不够清楚。我的单个任务/操作是多线程的。它需要3-4个线程。在同步队列中运行100,000个此类任务没有意义,因为我当时只使用3-4个线程。我正在尝试的是: (好吧,假设我们有一个队列)队列中的第一个任务获得它想要的一切(最多4个线程,对吗?)...我仍然有4个空闲线程(或更多,取决于机器)。我不想浪费他们,所以我想在那里开展其他任务......这是疯了吗?

    EDIT2: 现在我只使用一个线程池。这真的很糟糕。我有8个核心CPU。我开始测试40个任务。它一次计算几乎40个...意思是,对于第一个结果我需要等待10分钟(它是30秒/任务运行同步)

2 个答案:

答案 0 :(得分:1)

线程池专门用于回收线程,因此改变优先级会干扰这种理念。

但是,在处理任务时,您可以通过在自定义TaskScheduler

中创建显式线程来实现

Windows支持七个相对线程优先级:空闲,最低,低于正常,正常,高于正常,最高和时间紧急。

高级方法 -

  1. 通过扩展TaskScheduler创建自定义TaskScheduler
  2. 这里的关键点是TaskScheduler将使用一个单独的线程(具有您想要的优先级)来处理已排队的任务
  3. Task.Factory.StartNew将使用此自定义TaskScheduler来执行任务。

答案 1 :(得分:0)

将剩余的4个线程分配给100,000个任务似乎效率低下,特别是因为一旦完成第一个任务,您将需要赶紧执行第二个任务。你为什么不做别的事情 - 为第一个任务分配4个线程,为第二个任务分配4个线程,依此类推,直到你的CPU耗尽为止。完成其中一个任务后,为队列中的下一个任务分配线程。

相关问题