C# 在.NET中,线程池中任务的优先级是否可能?

C# 在.NET中,线程池中任务的优先级是否可能?,c#,.net,multithreading,performance,threadpool,C#,.net,Multithreading,Performance,Threadpool,在.NET中,线程池中任务的优先级是否可能 我有一张……的清单。。很多操作的数量。我想在threadpool中运行它们。。但是 我想做的是设置threadpool,所以它是这样工作的: 给予第一个行动/任务最高优先级-只关注第一个任务 其余任务将获得最低优先级 第一个任务完成后,将最高优先级设置为第二个任务 第二个任务完成后,将最高优先级设置为第三个任务,以此类推 就像你想从torrents下载整个一季的电视节目一样(我不推荐这样),然后尽快开始观看 我可以设置这样的线程池吗?还是有比threa

在.NET中,线程池中任务的优先级是否可能

我有一张……的清单。。很多
操作的数量
。我想在threadpool中运行它们。。但是 我想做的是设置threadpool,所以它是这样工作的:

  • 给予第一个行动/任务最高优先级-只关注第一个任务
  • 其余任务将获得最低优先级
  • 第一个任务完成后,将最高优先级设置为第二个任务
  • 第二个任务完成后,将最高优先级设置为第三个任务,以此类推
  • 就像你想从torrents下载整个一季的电视节目一样(我不推荐这样),然后尽快开始观看

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

    我试着做了很多解决方案,但一切都“太过手工”。比如,运行单独的
    Task.Factory.StartNew
    线程池
    ThreadPool
    。或者只通过
    Task.Factory.StartNew
    运行线程

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

    EDIT2:
    现在我只使用线程池。真糟糕。我有8核cpu。我开始40项任务只是为了测试。它一次计算出将近40。。。这意味着,对于第一个结果,我需要等待10分钟(这是30秒/任务运行同步)

    线程池是专门为循环使用线程而设计的,因此更改优先级会干扰这一理念

    但是,在处理任务时,可以通过在定制的
    TaskScheduler

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

    高级别方法-

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

  • 将剩余的4个线程分配给100000个任务似乎效率很低,尤其是当第一个任务完成后,您会想要匆忙完成第二个任务。为什么不做些别的事情呢?第一个任务分配4个线程,第二个任务分配4个线程,依此类推,直到CPU用完为止。其中一个任务完成后,为队列中的下一个任务分配线程。

    因此,您希望获得一组线程,并使它们在队列中同步而非异步运行(这就是使用线程的原因)?例如:如果您有8个线程。我希望第一个任务在4个线程上运行,其余4个线程上运行100000个剩余任务。第一个线程完成后,第二个线程将获得最佳优先级。听起来您只想将其用于本地线程。我知道一旦线程启动,就没有办法调整优先级。事实上,在HPC或Hadoop中,一旦CPU最初捕获它们,就不能更改它们的数量。如果您暂停了除前4个线程之外的所有线程,并且当其中一个线程完成时,您可以让另一个线程继续运行,我的理解是:您的所有任务都需要3-4个线程吗?如果是这样的话,你可以排一个队,一次两个。Parallel.ForEach在这里也可能是一个选项,但这不能保证它将使用多少线程。@EJoshuaS因此,任务需要的线程数和可用线程数是可变的。如果你的机器上有4个线程,任务需要8个线程,那么它将运行同步。最重要的是第一个/下一个任务,只有在资源(线程)未使用时,才应运行其余任务。