从控制台应用程序异步获取stdout而无需等待控制台退出

时间:2011-03-29 01:21:02

标签: c# processstartinfo redirectstandardoutput

我的问题是从我的应用程序生成的一个小型长时间运行的控制台应用程序中获取一些控制台标准输出。

我的应用程序启动控制台应用程序,控制台应用程序将保持活动状态,在应用程序生命周期内(或直到明确杀死)监听端口。

当控制台应用程序启动时,它会输出正在侦听的端口号,我需要异步获取该端口号并在应用程序的其他位置使用它。问题是,我的事件处理程序从不调用输出数据。我确信我必须忘记做一些微不足道的事情。

  ProcessStartInfo si = new ProcessStartInfo();
  si.FileName = theFileName;
  si.Arguments = theargs;
  si.UseShellExecute = false;
  si.RedirectStandardOutput = true;
  si.CreateNoWindow = true;
  _process = Process.Start(si);
  _process.OutputDataReceived += (sender, args) =>
    {
      //Parse the args.Data string for the port number.
    };
  _process.BeginOutputReadLine(); // My handler never gets called.
  // I don't want to call _process.WaitForExit() here as this is a long running process.

1 个答案:

答案 0 :(得分:1)

在我的特定情况下,问题是由控制台应用程序没有刷新标准输出引起的。

控制台应用程序是用python编写的(然后通过py2exe在windows中运行),它需要......

sys.stdout.flush()

要在我们在app退出之前获得任何输出之前调用。