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

31 c# process shellexecute

我想执行命令行工具来处理数据.它不需要阻止.我希望它是低优先级.所以我写了下面的内容

 Process app = new Process();
 app.StartInfo.FileName = @"bin\convert.exe";
 app.StartInfo.Arguments = TheArgs;
 app.PriorityClass = ProcessPriorityClass.BelowNormal;
 app.Start();
Run Code Online (Sandbox Code Playgroud)

但是,我得到一条System.InvalidOperationException消息"没有进程与此对象关联." 为什么?如何以低优先级正确启动此应用程序?

没有这条线app.PriorityClass = ProcessPriorityClass.BelowNormal;,应用运行正常.

Rob*_*vey 46

尝试在启动该过程后设置PriorityClass.任务管理器以这种方式工作,允许您为已经运行的进程设置优先级.

  • 原来这是唯一的方法。 (2认同)
  • 这实际上是一个大问题。我有时会觉得这一刻足够长,足以完成整个过程。因此,当它尝试设置已完成进程的优先级时,我最终会出现间歇性运行时崩溃。这是一个严重的设计缺陷。 (2认同)

Pab*_*lla 7

您可以通过稍微破解来创建优先级较低的进程.您降低父进程优先级,创建新进程,然后恢复为原始进程优先级:

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

parent.PriorityClass = ProcessPriorityClass.Idle;
var child            = Process.Start("cmd.exe");
parent.PriorityClass = original;
Run Code Online (Sandbox Code Playgroud)

childIdle在开始时优先处理流程.

  • 这是迄今为止最好的没有竞争的解决方案。其他解决方案需要等到进程运行,如果您启动一个启动其他子进程的脚本,那么这可能会成为一个问题,然后这些子进程将以初始优先级运行,而不是您稍后设置的优先级。 (2认同)

Rog*_*mbe 5

如果您准备P / Invoke到CreateProcess,则可以传递CREATE_SUSPENDED这些标志。然后,您可以在恢复过程之前调整过程优先级。