Всегда ли происходит событие System.Diagnostics.Process.Exited? - PullRequest
0 голосов
/ 16 ноября 2011

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

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

Я готов предоставить дополнительную информацию, когда это возможно. В настоящее время я также ограничен .NET Framework 2.0 с этой текущей сборкой.

1 Ответ

1 голос
/ 16 ноября 2011

Это зависит от вида сбоя - некоторые сбои оставляют «процесс» в памяти (например, просто застряли в каком-то бесконечном цикле ИЛИ что COM-объект открыл диалоговое окно модальной ошибки и ждет пользователя) ... эти случаи не охватываются никаким методом, упомянутым в вашем описании ...

По моему опыту, чтобы быть действительно устойчивым, вам нужна комбинация:

  • перехватите событие Exited (если вы запустили приложение через Process) ИЛИ найдите идентификатор процесса и проследите, чтобы
  • перехватывает любые исключения из этого COM-объекта
  • реализовать логику тайм-аута + прерывания для вызовов к этому COM-объекту / приложению
  • «Мониторинг» COM-объекта / приложения
    Обычно я запускаю отдельный поток перед вызовом такого COM-объекта ... этот поток контролирует COM-объект / приложение, например, если он открывает какое-либо окно, которое не предполагается, или потребление памяти идет вверх, когда это не предполагается, и т. Д. - отслеживаемые вещи и реакция на каждую из них довольно специфична для этого COM-объекта / приложения ...
...