不久前我问到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."
答案 0 :(得分:2)
您的选择是:
因为即使您检查,该过程仍然可以在您检查和尝试设置之间退出。所以,真的,只需使用选项#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;
}
我同意其他答案,但你仍然应该抓住你的例外并正确处理它们。