Получение stdout из консольного приложения асинхронно, не дожидаясь выхода консоли - PullRequest
1 голос
/ 29 марта 2011

У меня проблема с получением некоторого стандартного вывода консоли из небольшого долго работающего консольного приложения, порожденного моим приложением.

Мое приложение запускает консольное приложение, и консольное приложение остается в живых, слушая порт дляпродолжительность жизни моих приложений (или пока явно не уничтожена).

Когда консольное приложение запускается, оно выводит номер порта, который прослушивает, мне нужно асинхронно захватить этот номер порта и использовать его в другом месте приложения.Проблема в том, что мой обработчик событий для получения выходных данных никогда не вызывается.Я уверен, что должно быть что-то тривиальное, что я забыл сделать.

  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 Ответ

1 голос
/ 29 марта 2011

Хорошо, в моем конкретном случае проблема была вызвана тем, что консольное приложение не сбрасывает стандартный вывод.

Консольное приложение было написано на python (затем было запущено в windows с помощью py2exe), оно требовало ...

sys.stdout.flush()

Чтобы вызвать до того, как мы получим какой-либо вывод до выхода из приложения.

...