【问题标题】:How do I launch a process with low priority? C#如何启动低优先级的进程? C#
【发布时间】:2010-11-03 20:48:15
【问题描述】:

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

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

但是,我收到了 System.InvalidOperationException 消息“没有进程与此对象关联”。为什么?如何以低优先级正确启动此应用?

没有app.PriorityClass = ProcessPriorityClass.BelowNormal; 行,应用程序运行良好。

【问题讨论】:

    标签: c# process shellexecute


    【解决方案1】:

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

    【讨论】:

    • 原来这是唯一的方法。
    • 正如 Alois Kraus 所指出的,这给出了一个竞争条件。这是 Microsoft 设计的方式这一事实并没有使它成为一个非常糟糕的想法。
    • 比赛条件与否,我看不到这里的问题。该进程将暂时以父进程的优先级运行。
    • 其实是个大问题。我有时会觉得这一刻足够长,可以完成整个过程。因此,当它尝试设置已完成进程的优先级时,我最终会出现间歇性运行时崩溃。这是一个严重的设计缺陷。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这是迄今为止最好的解决方案,没有种族。其他解决方案需要等到进程运行,如果你开始,这可能是一个问题,例如启动其他子进程的脚本,这些子进程将以初始优先级运行,而不是稍后设置的优先级。
    • 我真的不喜欢这样,但我更喜欢调试间歇性错误。事实证明这实际上是唯一的方法。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 2012-02-21
      • 2011-09-07
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多