现在我正在开发一个Console Runner应用程序,该应用程序具有以下代码来输出日志并等待该过程完成:
using (Process p = Process.Start(ps))
{
p.OutputDataReceived += OutputReceived;
p.ErrorDataReceived += ErrorReceived;
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit(30000);
return p.ExitCode;
}
我对这段代码有两个问题。
答案 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;