2010-08-17 3 views
12

Есть ли возможность проверить код, если другой процесс не отвечает?Как проверить, не отвечает ли процесс?

Проблема даже в том случае, если приложение разбито, а в списке Менеджера отмечен как «Не реагировать», свойство Process.Responding по-прежнему возвращает «true».

Событие и функция 'Exited' 'WaitForExit' выполняют любое действие, если процесс - это то, что было открыто. Так что дело не в этом.

Проблема в двух словах; Мне нужно знать, что приложение разбилось. Как проверить это из кода?

Спасибо за ваше время.

+1

Имеет ли другой процесс (видимое) главное окно? Это требуется «Process.Responding», см. Http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx –

+0

Мое приложение должно проверить другой процесс, определенный пользователем по адресу время выполнения. поэтому я не знаю, является ли это консольным приложением. – futurlo

+3

За исключением эскизов менеджеров задач для приложений GUI (IIRC: он обрабатывает сообщение WN_NULL своевременно), нет общего способа определения «зависания» (например, он может ждать чего-то или занятого выполнением работы). – Richard

ответ

19

Общее решение этой проблемы отсутствует.

Невозможно определить, висит ли какой-либо конкретный процесс или нет, поскольку термин «зависание» полностью зависит от контекста выполняемого процесса.

Процесс подвески всегда будет делать то, что он кодировал. Разработчик, возможно, плохо кодировал его, но Windows не может делать предположения о том, что правильно или неправильно.

Возможные идеи попробовать может быть:

  1. Process.Responding вызов будет указывать или нет процесс, который выполняется цикл окна сообщений отвечает.

  2. Одним из возможных решений для более общего случая может быть опрос использования памяти для процесса с интервалами, и если он не изменится через некоторое время, предположите, что он висит. Вы можете сделать это с помощью Process.WorkingSet64. Тем не менее, я ожидаю, что это вызовет ряд ложных срабатываний - стабильные процессы, которые не обрабатывают ничего, могут оказаться висящими. Это также привело бы к ложным негативам, когда висячий процесс с утечкой памяти, казалось бы, делал что-то полезное, когда на самом деле он застревал в цикле.

  3. Если процесс записывает потоки StandardError/StandardOutput (как это делают многие консольные приложения), то вы можете попробовать слушать такой выход: Process.BeginOutputReadLine и Process.BeginErrorReadLine. Если в течение определенного периода нет такого вывода, вы можете сделать вывод, что он повесился.

Но вы не найдете ничего, что работает в общем случае.

Смежные вопросы