2013-08-27 2 views
8

Недавно я видел некоторые производства код для эффекта:Может ли процесс Process.HasExited быть истинным для текущего процесса?

if (Process.GetCurrentProcess().HasExited) 
{ 
    // do something 
} 

Есть ли в этом смысл? Интуитивно, если процесс вышел, в нем не может быть запущен код.

Если нет, что было бы хорошим способом определить, завершается ли текущий процесс?

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

+0

это имеет для меня много смысла, в чем проблема? –

+2

Как я уже сказал, «Интуитивно, если процесс вышел, тогда в нем не может работать код». Поэтому этот код никогда не будет запущен и бессмыслен. – Asik

+0

В каком контексте выполняется код? Я имею в виду многопоточность. –

ответ

3

Проверьте исходный код IsExited, что не происходит ничего впечатляющего. IsExited запрашивает ОС, завершился ли процесс и каков был код выхода. Вот и все.

Вся тема перенаправления вывода не применяется.

Код, который вы нашли там, всегда будет иметь значение false. Удалите его и узнайте, кто написал его, чтобы спросить, что он имел в виду. Наверное, недоразумение.

0

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

см примечания в http://msdn.microsoft.com/en-US/library/system.diagnostics.process.hasexited.aspx:

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

+0

Это выходная обработка. Процесс по-прежнему не может запускать код, когда он не запущен. – Ryan

+5

Это относится к * другому * процессу, а не к вашему. –

+0

хорошо пункт. Мне любопытно, что произойдет, если вы поймаете свой собственный результат? Но я должен сказать, что это тупик ... – eFloh

1

От Thread.IsBackground:

После того, как все нити переднего плана, принадлежащие к процессу окончились, общий язык среда выполнения завершает процесс. Любые оставшиеся фоновые потоки останавливаются и не завершаются.

Для меня это означает, что ни одна нить никогда не выполнит какой-либо код после завершения процесса.

Что касается заявления от Process.HasExited:

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

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

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