Этот код работает, как ожидалось, на большом количестве машин. Однако на одной конкретной машине вызов 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();
}
Обратите внимание, что в отличие от аналогичного вопроса на SO, вызываемый процесс notepad.exe
(для целей тестирования), так что маловероятно, что с ним возникла ошибка - т.е. он не порождает второй подпроцесс и закрытие. Тем не менее, это не объяснит, почему он работает на всех других машинах.
На проблемной машине второй вызов Console.WriteLine(proc.HasExited))
возвращает true
, хотя блокнот все еще явно открыт, как на экране, так и в диспетчере задач.
Аппарат работает под управлением Windows 7 и .NET 4.0.
Мой вопрос: какие условия на этой конкретной машине могут быть причиной этого? Что я должен проверять?
Изменить - все, что я пробовал до сих пор/Обновления/Возможно релевантная информация:
- Переустановил .NET.
- Закрытие любых процессов, которые я не знаю в диспетчере задач.
- Windows еще не активирована на этом компьютере.
- Следуя рекомендациям в комментариях, я попытался получить "существующий" идентификатор процесса, используя
GetProcessesByName
, но просто возвращает пустой массив на проблемную машину. Поэтому трудно сказать, что проблема даже сWaitForExit
, так как процесс не возвращается вызовомGetProcessesByName
еще до вызоваWaitForExit
. - На проблемной машине результирующий процесс Notepad ParentID - это идентификатор процесса блокнота, который запускается вручную, или, другими словами, блокнот порождает дочерний процесс и завершает себя.