Как правильно использовать System.Diagnostics.Process

Иконка процесс

Я видел много вопросов на stackoverflow и других ресурсах о том как запустить процесс и получить его вывод. Правильно использовать System.Diagnostics.Process не так просто, и чаще всего это делается неправильно.

Некоторые общие ошибки с System.Diagnostics.Process:

  1. Отсутствие перехвата обоих выходных потоков  (error & output)
  2. Отсутствие перенаправления ввода (input) может привести к зависанию приложения
  3. Отсутствие закрытия перенаправленного ввода может привести к зависанию приложения
  4. Отсутствие вызова BeginOutputReadLine/ BeginErrorReadLine при использовании событий
  5. Использование OutputDataReceived/ ErrorDataReceived без ожидания  null
  6. Отсутствие проверки на null в обработчиках событий OutputDataReceived/ ErrorDataReceived
  7. Забывание установить EnableRaisingEvents = true при использовании события  Exited
  8. Забывание настроек ErrorDialog, CreateNoWindow или  UseShellExecute
  9. Неправильная обработка читателей потоков (stream readers) StandardOutput или  StandardError

Учитывая вышеприведенное, привожу некоторые базовые указания:

  1. Используйте события OutputDataReceived/ ErrorDataRecieved а НЕ StandardOutput или StandardOutput.  Это спасет вас от головной боли и ненужного управления потоками.
  1. Всегда перехватывайте весь вывод И ввод, а если не планируете задавать ввод, то сразу же закройте поток.
  1. Ваш процесс не закончится до тех пор, пока он не вышел И вы не считали все данные. Событие OutputDataReceived МОЖЕТ И БУДЕТ сгенерировано после того как закончился вызов метода WaitForExit(). Необходимо будет подождать обработчиков для каждого выходного потока и установить дескриптор ожидания (wait handle) как только будет получено null.

Источник тут.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>