繁体   English   中英

异步使用System.Diagnostics.Process,在确定退出之前,我应该如何确保收到最后一个输出?

[英]Using System.Diagnostics.Process asynchronously, how should I ensure that I've received the last output before determining it has exited?

考虑这个例子C#代码(不相关的部分遗漏):

using System.Diagnostics.Process;

var process = new Process();
var startInfo = process.StartInfo;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputHandler;
process.ErrorDataReceived += ErrorHandler;
process.Exited += ExitHandler;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();

现在,我想通知一个监听器,在没有更多的输出(stdout / stderr)从它读取之后 ,该进程已经完成。 在确定进程是否真正完成之前,我如何在ExitHandler方法中确保OutputHandlerErrorHandler处理所有剩余的stdout / stderr?

显式使用Process.WaitForExit(-1)时有一个互锁。 在stdout和stderr的异步读取器指示文件结束状态之前,它不会返回。 在您的退出事件处理程序中调用它。 您必须使用-1的超时,否则将无效。 或者只是WaitForExit()。 哪个好,你知道它已经退出了。

当进程中止或终止时,将调用Exited事件。 因此,应该永远不会存在仍然需要读取数据的情况。

当操作系统关闭进程时,将通知正在等待退出的任何进程组件。 然后,组件可以使用它对进程具有的句柄来访问仍驻留在操作系统内存中的关联进程信息(例如ExitTime属性)。

由于关联的进程已退出,因此组件的Handle属性不再指向现有的进程资源。 相反,它只能用于访问操作系统有关进程资源的信息。 系统知道Process组件尚未释放的退出进程的句柄,因此它将ExitTime和Handle属性信息保留在内存中,直到Process组件专门释放资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM