C # - Процесс - Асинхронный - Читать весь вывод - PullRequest
0 голосов
/ 30 апреля 2018

Пытается использовать класс Process и его async функции. Не удалось понять, как прочитать весь вывод из Process до выхода из программы. Пожалуйста, помогите !!

Вот мой код,

void RunProcess()
{
  Process process = new Process
  {
      StartInfo = new ProcessStartInfo
      {
          FileName = CmdName,
          Arguments = CmdArgs,
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          RedirectStandardOutput = true,
          RedirectStandardError = true,
          UseShellExecute = false
      }
  };

  using(process)
  {
      process.OutputDataReceived += Process_OutputDataReceived;

      process.Start();
      process.BeginOutputReadLine();

      process.WaitForExit(); // Even waiting for exit here.

      _logger.Debug("End of process");
  }
} // void RunProcess()

void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  if (!String.IsNullOrEmpty(e.Data))
      _logger.Debug($"\t{e.Data}");
}

У меня есть другой код, который выполняется еще как минимум 30-45 секунд после того, как RunProcess() вызван и завершен метод, но я не вижу результатов моего процесса нигде в журналах.

Если я запускаю программу синхронно, я получаю все выходные данные. Но не вижу выхода при асинхронном запуске. Кто-нибудь знает, что я делаю не так, пожалуйста?

(Обновление вопроса, чтобы сделать его более понятным!)

Код, который я разместил выше, работает и является минимальным (лишенные проверки, классы и т. Д.). Я ищу предложения о том, как сделать так, чтобы моя программа остановилась, пока полный вывод не будет записан в лог-файлы. Кто-нибудь знает, есть ли способ сделать это с помощью комбинации WaitForExit и вызова события, как в коде выше, пожалуйста? Кажется, что процесс завершается первым и завершает обработчик события, прежде чем он сможет напечатать строки журнала.

Большое спасибо заранее !!

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете организовать свой код немного лучше. Сделайте некоторый класс, чтобы содержать ваш процесс. Посмотрите, как сделать async / await.

Удалите строку ниже и прочитайте вывод самого процесса, а не делегируйте его.

  process.OutputDataReceived += Process_OutputDataReceived;

Как и когда использовать `async` и` await`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...