2016-04-14 2 views
1

У меня есть некоторый код, как это:не WaitForExit таймаут правильно, просто висит

process.CloseMainWindow(); 
if (!process.WaitForExit(5000)) { process.Kill(); } 

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

Это похоже на работу в большинстве случаев, но если процесс вызвал сообщение об ошибке Windows, он просто зависает. Раньше у меня был только «process.Kill()», и это сработало, поэтому я должен предположить, что он фактически застревает в вызове WaitForExit (5000), хотя я даю ему значение тайм-аута.

Любые причины этого происходили?

EDIT: Мне интересно, возможно ли это, что на самом деле это зависание CloseMainWindow(), из-за этого сообщения об ошибке. В этом случае, проверяя свойство «отвечающего» процесса, прежде чем пытаться метод CloseMainWindow() на самом деле вернуть «false»? Если это так, я могу проверить это, а затем использовать Kill, если это так.

+0

Windows убивает процесс, поэтому выход никогда не возникает. – jdweng

+0

Нет, процесс все еще запущен, я вижу окно за окном ошибки. –

+0

Что касается тестирования, если у вас есть ошибка окна с Marshal.GetLastWin32Error. Если процесс запущен, завершите процесс. Попробуйте проверить, существует ли процесс до убийства. – jdweng

ответ

0

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

В любом случае, после прочтения файла справки CloseMainWindow() более внимательно, я увидел это:

Return Value 
Type: System.Boolean 
true if the close message was successfully sent; false if the associated 
process does not have a main window or if the main window is disabled (for 
example if a modal dialog is being shown). 

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

+0

Вы также можете проверить свойство [HasExited] (https://msdn.microsoft.com/en-us /library/system.diagnostics.process.hasexited(v=vs.110).aspx), выполнив 'process.Refresh()' перед тем, как проверить его в цикле while. – Quantic

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