首先需要说明的是,C#中的Process类可以用于启动和管理外部进程,包括可以获取该进程的标准输出流等信息。然而,有时候我们会遇到Process类中OutputDataReceived事件不触发的问题,也就是说并不能获取到进程的标准输出流信息。
出现这个问题的原因有多种,比如:
- 进程的输出缓冲区被填满;
- 进程输出数据流的标准输出缓冲区不存在;
- 异步读取操作运行缓慢,从而导致没有足够的数据到达缓冲区。
接下来,我将介绍几种解决OutputDataReceived事件不触发问题的方法。
方案一:使用BeginOutputReadLine和WaitForExit方法
在调用Process.Start方法启动进程之后,可以使用Process.BeginOutputReadLine方法异步读取其标准输出流数据。该方法启动异步读取操作,并返回控制权,然后可以通过WaitForExit方法等待进程的退出,最后在Process.OutputDataReceived事件中处理标准输出流的数据。下面是一段示例代码:
ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = startInfo;
proc.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
proc.Start();
proc.BeginOutputReadLine();
proc.WaitForExit();
private void OutputHandler(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
方案二:使用Synchronious方式读取
还可以使用Process.StandardOutput.Read方法以同步方式读取标准输出流。在这种情况下,使用Process.WaitForExit方法等待进程的退出,并且在处理标准输出流之前等待进程完成其输出。以下是示例代码:
ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = startInfo;
proc.Start();
string output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
Console.WriteLine(output);
在使用Process类的时候,还需要注意以下事项:
- 不需要使用Process.EnableRaisingEvents属性,因为Process.OutputDataReceived事件和Process.ErrorDataReceived事件只有在ProcessStartInfo.RedirectStandardOutput和ProcessStartInfo.RedirectStandardError属性为true时才会引发;
- 在运行Process.WaitForExit方法之前调用Process.BeginOutputReadLine方法或者Process.StandardOutput.ReadToEnd方法,否则可能会导致死锁;
- 在使用BeginOutputReadLine方法或者StandardOutput.ReadToEnd方法之前,必须设置ProcessStartInfo.UseShellExecute属性为false。
以上就是C#Process的OutputDataReceived事件不触发问题及解决的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#Process的OutputDataReceived事件不触发问题及解决 - Python技术站