如何启动低优先级的流程?C#

如何启动低优先级的流程?C#,c#,process,shellexecute,C#,Process,Shellexecute,我想执行一个命令行工具来处理数据。它不需要被阻塞。 我希望它是低优先级的。所以我写了下面的 Process app = new Process(); app.StartInfo.FileName = @"bin\convert.exe"; app.StartInfo.Arguments = TheArgs; app.PriorityClass = ProcessPriorityClass.BelowNormal; app.Start(); 但是,我得到一个System.invalid

我想执行一个命令行工具来处理数据。它不需要被阻塞。 我希望它是低优先级的。所以我写了下面的

 Process app = new Process();
 app.StartInfo.FileName = @"bin\convert.exe";
 app.StartInfo.Arguments = TheArgs;
 app.PriorityClass = ProcessPriorityClass.BelowNormal;
 app.Start();
但是,我得到一个
System.invalidoOperationException
,消息是“没有进程与此对象关联”。为什么?如何以低优先级正确启动此应用程序


没有行
app.PriorityClass=ProcessPriorityClass.BelowNormal应用程序运行正常。

启动该过程后,请尝试设置PriorityClass。任务管理器就是这样工作的,允许您对已经运行的进程设置优先级。

如果您准备p/Invoke到
CreateProcess
,您可以在标志中传递
CREATE\u SUSPENDED
。然后,您可以在恢复进程之前调整进程优先级。

您可以通过进行一些修改来创建优先级较低的进程。降低父进程优先级,创建新进程,然后恢复到原始进程优先级:

var parent   = Process.GetCurrentProcess();
var original = parent.PriorityClass;

parent.PriorityClass = ProcessPriorityClass.Idle;
var child            = Process.Start("cmd.exe");
parent.PriorityClass = original;

child
将在一开始就拥有
Idle
进程优先级。

结果表明这是唯一的方法。这是迄今为止没有竞争的最佳解决方案。其他解决方案需要等待进程运行,如果您启动,则可能会出现问题,例如,启动其他子进程的脚本,这些子进程将以初始优先级运行,而不是您稍后设置的优先级。