Создание исключений из обработчика Process.Exited - PullRequest
0 голосов
/ 29 мая 2009

У меня есть программа, которая запускает внешнюю утилиту командной строки и читает стандартный вывод (изображение в формате PNG). Первоначально во время тестирования программа командной строки записывала изображение во временный файл, а затем загружала файл в программа. У меня был обработчик для Process.Exited, который выдал исключение, если код выхода был ненулевым. Я вызвал WaitForExit перед загрузкой временного изображения, чтобы убедиться, что процесс завершен. Если возникло исключение, оно обрабатывалось в коде, который считывал временный файл изображения. Теперь я делаю вызов для создания файла изображения непосредственно после вызова Process.Start, который работает нормально, если нет ошибки. Если внешняя программа завершает работу ненормально, исключение, выданное обработчиком выхода, больше не перехватывается моим кодом. Если я вызываю WaitForExit до того, как прочитаю стандартный вывод, программа зависает. Есть ли способ отловить исключение, выданное обработчиком выхода, без вызова WaitForExit?

Ответы [ 2 ]

0 голосов
/ 29 мая 2009

Обработчик Process.Exited выполняется в контексте, отдельном от функции, которая запускает процесс. Вы можете исправить это двумя способами.

  1. Напишите цикл после запуска процесса. (Используя дескриптор процесса, вызовите WaitOne (100) внутри цикла. Если вы получили исключение, дескриптор пропал, и вы должны действовать так, как будто процесс завершился. Если вы не получите исключение, результат true указывает что процесс закрылся.)
  2. Создайте событие ManualResetEvent, которое вы сбрасываете () перед началом процесса. После запуска процесса вызовите WaitOne () для этого события. В обработчике Process.Exited Set () это событие, а затем основной метод продолжится.
0 голосов
/ 29 мая 2009

Звучит так, как будто вы не работаете из служебной программы командной строки. Вы проверили это, показав окно процесса, чтобы убедиться, что оно что-то делает неправильно?

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

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