0

不久前,我询问了当 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."
4

5 回答 5

2

您的选择是:

  1. 如果它已经退出,尝试设置它并捕获异常。
  2. 检查进程是否先退出,然后尝试设置它......如果它已经退出,仍然捕获异常。

因为即使您检查,该过程仍然可能在您检查和尝试设置它之间退出。所以,真的,只用选项#1,因为它的代码更少。

于 2009-06-22T19:42:52.873 回答
2

解决方法:启动暂停的进程,然后改变优先级,再恢复进程。

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

于 2009-06-22T20:12:34.310 回答
1

为什么要避免捕获和异常情况,您知道如何在尽可能低的级别处理?如果您可以设置优先级,那就太好了!如果没有,则该过程已退出并且您的工作已完成。我认为没有任何理由尝试避免适当地处理错误。

于 2009-06-22T19:47:54.843 回答
0

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

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

于 2009-06-22T19:42:49.113 回答
-2

你总是可以使用 if 语句:

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

不过,我同意其他答案,但无论如何,您仍然应该捕获异常并正确处理它们。

于 2009-06-22T19:57:12.250 回答