在 .NET 中可以对线程池中的任务进行优先级排序吗?

chr*_*ris 5 .net c# performance multithreading threadpool

在 .NET 中可以对线程池中的任务进行优先级排序吗?

我有一份..很多..的清单Actions。我想在线程池中运行它们..但是。我想做的是设置线程池,所以它的工作方式如下:

  1. 给予第一个行动/任务最高优先级 - 只关注第一个任务。
  2. 其余任务将获得最低优先级。
  3. 当第一个任务完成后,将最高优先级设置为第二个任务。
  4. 当第二个任务完成后,将最高优先级设置为第三个任务,依此类推。

这就像当你想从种子下载整个季节的电视节目(我不推荐)并尽快开始观看时。

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

我试图做很多解决方案,但一切都“太手动”。就像,Task.Factory.StartNew沿着一边运行单独的线程ThreadPool。或者仅通过Task.Factory.StartNew.

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

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

Kap*_*oor 1

线程池是专门为线程回收而设计的,因此改变优先级会干扰这一原理。

但是,在处理任务时,您可以通过在定制的线程中创建显式线程来实现TaskScheduler

Windows 支持七种相对线程优先级:空闲、最低、低于正常、正常、高于正常、最高和时间关键。

高层次方法——

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