通过OutputDataReceived事件捕获进程输出

Bor*_*ris 40 c# stdout process

我正试图以"实时"(当它正在运行时)捕获过程输出.我使用的代码相当简单(见下文).由于某些奇怪的原因,从不调用OutputDataReceived事件.为什么?

private void button2_Click(object sender, EventArgs e)
    {
      // Setup the process start info
      var processStartInfo = new ProcessStartInfo("ping.exe", "-t -n 3 192.168.100.1")
      {
        UseShellExecute = false,
        RedirectStandardOutput = true
      };

      // Setup the process
      mProcess = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true };

      // Register event
      mProcess.OutputDataReceived += OnOutputDataReceived;

      // Start process
      mProcess.Start();
      mProcess.WaitForExit();
    }

    void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
    {
       //Never gets called...
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 74

你需要打电话

mProcess.BeginOutputReadLine();
Run Code Online (Sandbox Code Playgroud)

BeginOutputReadLine - "在应用程序的重定向StandardOutput流上开始异步读取操作."

  • 请注意,此调用需要在*`mProcess.Start()之后执行*.输出将在两次调用之间保留. (15认同)
  • 此外,外部过程需要在输出内容时刷新其输出缓冲区.如果不进行刷新,输出缓冲区可能会持续到外部进程退出为止; 这使得主应用程序无法捕获输出"实时". (9认同)
  • 此外,一些应用程序正在写入标准ERROR而不是标准OUTPUT.通常,手动查看输出时无法有所作为.因此,请尝试添加以下内容:"RedirectStandardError = true"和"mProcess.BeginErrorReadLine();". (2认同)