降低Task.Factory.StartNew线程的优先级

下面的代码将启动一个新线程来执行此任务。有什么方法可以控制该线程的优先级吗

Task.Factory.StartNew(()=&gt{
//这里的所有内容都将在新线程中执行。
//我想将此线程的优先级设置为低于正常值
});

正如其他人所提到的,您需要指定一个自定义调度程序来执行任务。不幸的是,没有合适的内置调度器

您可以使用Glenn链接的ParallelExtensionsExtras,但是如果您想要一些简单的东西,可以直接粘贴到代码中,请尝试以下方法。这样使用:

Task.Factory.StartNew(()=&gt{
//这里的所有内容都将在优先级低于正常值的线程中执行
},null,TaskCreationOptions.None,PriorityScheduler.BelowNormal);

守则:

公共类优先级调度程序:任务调度程序
{
public static PriorityScheduler overnormal=新的PriorityScheduler(ThreadPriority.overnormal);
public static PriorityScheduler BelowNormal=新的PriorityScheduler(ThreadPriority.BelowNormal);
public static PriorityScheduler Lowest=新的PriorityScheduler(ThreadPriority.Lowest);
私有BlockingCollection<Task>_tasks=新建BlockingCollection<Task>();
私有线程[]\u线程;
私有线程优先级_优先级;
私有只读int_maximumConcurrencyLevel=Math.Max(1,Environment.ProcessorCount);
公共优先级计划程序(线程优先级)
{
_优先级=优先级;
}
公共覆盖int最大并发级别
{
获取{return\u maximumConcurrencyLevel;}
}
受保护的重写IEnumerable<Task>GetScheduledTasks()
{
返回任务;
}
受保护的覆盖无效队列任务(任务任务)
{
_任务。添加(任务);
如果(_threads==null)
{
_线程=新线程[_最大并发级别];
对于(int i=0;i<_threads.Length;i++)
{
int local=i;
_线程[i]=新线程(()=>
{
foreach(任务中的任务t_tasks.GetConsumingEnumerable())
基.TryExecuteTask(t);
});
_线程[i]。名称=$“优先级调度程序:{i}”;;
_线程[i]。优先级=\u优先级;
_线程[i]。IsBackground=true;
_线程[i].Start();
}
}
}
受保护的覆盖bool TryExecuteTaskInline(任务任务,bool任务先前排队)
{
return false;//我们可能不希望执行应作为高优先级或低优先级内联调度的任务
}
}

注:

  • 工作线程都是后台线程,因此不应使用此调度器调度重要任务;只有那些在进程关闭时可以丢弃的
  • 改编自Bnaya Eshet的实施
  • 我不完全理解每一个超控;只需使用Bnaya对MaximumConcurrencyLevelGetScheduledTasksTryExecuteTaskInline的选择即可

发表评论