Этот код работает, как ожидалось, на большом количестве машин. Однако на одной конкретной машине вызов WaitForExit()
, по-видимому, игнорируется и фактически отмечает процесс как завершенный.Process.WaitForExit несовместим для разных машин
static void Main(string[] args)
{
Process proc = Process.Start("notepad.exe");
Console.WriteLine(proc.HasExited); //Always False
proc.WaitForExit(); //Blocks on all but one machines
Console.WriteLine(proc.HasExited); //**See comment below
Console.ReadLine();
}
Обратите внимание, что в отличие от similar question на SO, процесс называют это notepad.exe
(по причинам тестирования), так что вряд ли вина лежит с ним - то есть он не порождая второй суб-процесса и закрытия. Тем не менее, это не объяснит, почему он работает на всех других машинах.
На проблемной машине второй вызов Console.WriteLine(proc.HasExited))
возвращает true
, хотя блокнот все еще четко открыт, как на экране, так и в диспетчере задач.
Аппарат работает под управлением Windows 7 и .NET 4.0.
Мой вопрос: какие условия на этой конкретной машине могут быть причиной этого? Что я должен проверять?
Edit - Вещи, которые я пробовал до сих пор/Updates/возможно, соответствующей информации:
- Заново .NET.
- Закрыт любые процессы, которые я не знаю в диспетчере задач.
- Windows еще не активирована на этой машине.
- Следуя советам в комментариях, я попытался получить «существующий» идентификатор процесса, используя
GetProcessesByName
, но это просто возвращает пустой массив на проблемную машину. Поэтому трудно сказать, что проблема даже сWaitForExit
, так как процесс не возвращается, вызываяGetProcessesByName
еще до вызоваWaitForExit
. - На проблемном компьютере полученный ParentID процесса в блокноте процесса - это идентификатор процесса блокнота, который запускается вручную, или, другими словами, блокнот порождает дочерний процесс и завершает себя.
Возможно ли, что раньше открывался еще один Блокнот? Итак, вы создаете один, убиваете одного, но видите старый блокнот? 'proc.WaitForExit()' может немедленно возвращаться, если процесс не может быть создан или был немедленно разорван по некоторым причинам, например, отсутствие привилегий исходного кода для создания новых процессов. – oleksii
@oleskii, нет, я убедился в этом. Блокнот используется здесь только как процесс, «который все знают», эта проблема возникает независимо от того, какой файл используется для этого процесса. – Rotem
@oleskii "proc.WaitForExit() может немедленно вернуться, если процесс не может быть создан или был расторгнут сразу по каким-либо причинам" - не будет ли процесс фактически прекращен в этом случае? – Rotem