【问题标题】:Start a process in low Priority. Is it possible without try-catch?以低优先级启动进程。没有try-catch有可能吗?
【发布时间】:2009-06-22 19:38:25
【问题描述】:

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

【问题讨论】:

    标签: c# external-process


    【解决方案1】:

    您的选择是:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 问题不在于捕获异常。问题是异常被抛出。这样做意味着我不能轻易地在抛出 InvalidOperationException 时中断,因为我们希望它会被抛出。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          你总是可以使用 if 语句:

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

          虽然我同意其他答案,但您仍然应该捕获异常并正确处理它们。

          【讨论】:

          • 这里还有一个竞争条件 :)
          猜你喜欢
          • 2018-04-01
          • 1970-01-01
          • 2012-02-21
          • 2012-11-27
          • 2011-09-07
          • 2010-11-03
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多