以低优先级启动进程。没有try-catch有可能吗?

时间:2009-06-22 19:38:25

标签: c# external-process

不久前我问到app.PriorityClass =时发生的错误消息?在app.start之前。显然,我不喜欢的解决方案是在开始后写它。

直到今天它仍然没有太多问题。我得到一个“无法处理请求,因为该进程已退出。”异常,因为该过程快速完成,不会更改其优先级(某些时候)。尝试一下这种感觉很糟糕。什么是真正的解决方案?我如何启动低优先级的流程?

            Process app = new Process();
            app.StartInfo.FileName = @"bin\convert.exe";
            app.StartInfo.Arguments = string.Format("{0} -resize 150x150 {1}", filename, thumbName);
            //app.PriorityClass = ProcessPriorityClass.BelowNormal; //No process is associated with this object.
            app.Start();
            //app.PriorityClass = ProcessPriorityClass.BelowNormal; //"Cannot process request because the process has exited."

5 个答案:

答案 0 :(得分:2)

您的选择是:

  1. 尝试设置它并捕获异常(如果它已经退出)。
  2. 检查进程是否已先退出,然后尝试设置它......如果已经退出,仍然会捕获异常。
  3. 因为即使您检查,该过程仍然可以在您检查和尝试设置之间退出。所以,真的,只需使用选项#1,因为它的代码更少。

答案 1 :(得分:2)

解决方案:启动流程暂停,然后更改优先级,然后恢复流程。

这是在Win32中使用CREATE_SUSPENDED在CreateProcess调用中完成的,但不幸的是我不知道.NET方式。

答案 2 :(得分:1)

为什么你想要避免捕获和异常条件,你知道如何在尽可能低的水平处理?如果你可以设置优先级,太棒了!如果没有,该过程已退出,您的工作已完成。我认为没有任何理由试图避免适当地处理错误。

答案 3 :(得分:0)

你能做的任何测试都会立即成为竞争条件;如果应用程序快速退出,我能想到的唯一安全的事情就是使用try / catch

除非从stdio读取?在这种情况下,您可以重定向它,故意不要关闭输入流,直到您更改了优先级。

答案 4 :(得分:-2)

您总是可以使用if语句:

if (!app.HasExited)
{
   app.PriorityClass = ProcessPriorityClass.BelowNormal;
}

我同意其他答案,但你仍然应该抓住你的例外并正确处理它们。