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

本文关键字:何确保 我应该 确保 Process Diagnostics 最后一个 退出 异步 输出 System | 更新日期: 2023-09-27 18:08:04

考虑以下示例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方法中,所有剩余的stdout/stderr都由OutputHandlerErrorHandler处理,然后确定该进程已经真正完成?

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

当你显式地使用Process.WaitForExit(-1)时,会产生连锁反应。在标准输出和标准错误的异步读取器指示文件结束状态之前,它不会返回。在退出事件处理程序中调用它。您必须使用-1的超时,否则这将不起作用。或者只是WaitForExit()。这很好,你知道它已经退出了

在进程中止或终止时调用Exited事件。因此,不应该出现仍然有数据要读取的情况。

当操作系统关闭一个进程时,任何进程组件正在等待退出通知。然后组件就可以访问中仍然驻留的相关进程信息操作系统内存(如ExitTime属性)处理它必须处理的进程。

因为关联的进程已经退出,所以组件不再指向现有的流程资源。相反,它只能用于访问操作系统的有关信息进程资源。系统知道要退出的句柄进程组件还没有被释放,所以它将ExitTime和Handle属性信息保存在内存中,直到进程组件专门释放资源。