Process.WaitForExit(Int32)已

时间:2014-02-05 12:40:07

标签: c# process

现在我正在开发一个Console Runner应用程序,该应用程序具有以下代码来输出日志并等待该过程完成:

using (Process p = Process.Start(ps))
{
    p.OutputDataReceived += OutputReceived;
    p.ErrorDataReceived += ErrorReceived;
    p.BeginOutputReadLine();
    p.BeginErrorReadLine();
    p.WaitForExit(30000);
    return p.ExitCode;
}

我对这段代码有两个问题。

  1. 我注意到如果进程耗时超过30秒,则调用p.ExitCode炸弹。
  2. 如果我的流程只需1秒钟会发生什么,它会等待30秒还是CLR会建议流程?

1 个答案:

答案 0 :(得分:2)

来自ExitCode的{​​{3}}:

  

如果在进程退出之前尝试获取ExitCode,则尝试将引发异常。首先检查HasExited属性以验证关联的进程是否已终止。

无法保证当您致电WaitForExit时,此流程将退出。来自WaitForExit的{​​{3}}:

  

WaitForExit(Int32)重载用于使当前线程等待,直到关联的进程终止。此重载指示Process组件等待有限的时间以使进程退出。如果关联进程在间隔结束时没有退出,因为拒绝终止请求,则返回false到调用过程。您可以指定负数(无限)(毫秒),Process.WaitForExit(Int32)的行为与WaitForExit()重载相同。如果将0(零)传递给方法,则仅当进程已退出时才返回true;否则,它立即返回false。

请注意,这可以回答您的第二个问题。如果进程在超时之前退出,则WaitForExit返回。

由于您指定了有限超时,因此您可以在进程完成之前返回函数。所以,你可以像这样编写代码:

if (p.WaitForExit(30000))
    return p.ExitCode;
else
    return NotFinishedExitCode;

或者更简洁地使用条件表达式:

return p.WaitForExit(30000) ? p.ExitCode : NotFinishedExitCode;