2010-02-09 2 views
7

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

У меня возникли проблемы с некоторыми установщиками, которые порождают другие процессы с исходным процессом, возвращаемым до того, как установка завершена. Есть ли способ, которым я могу дождаться завершения всех процессов?

Чтобы прояснить вот сценарий у меня возникают проблемы с:

  1. Launch Installer1
  2. Installer1 нерестится/запускает другой установщик (Installer2)
  3. Installer 1 возвращает
  4. Применение думает установки имеет но Installer2 все еще работает. Это вызывает проблемы с рабочим процессом в приложении.

Вот код, я использую в данный момент:

// launch installer 
Process process = windowsApplicationLauncher.LaunchApplication(_localFilePath); 

// wait for process to return 
do 
{ 
    if (!process.HasExited) 
    { 
    } 
} 
while (!process.WaitForExit(1000)); 

if (process.ExitCode == 0) 
{ 
    _fileService.MoveFile(_localFilePath, _postInstallFilePath); 

    _notification.SetComplete(false); 

    return true; 
} 
return false; 
+0

У вас есть порожденные процессы? Например. можете ли вы изменить Installer2, если это облегчит вам обнаружение завершения? Или Installer2 поставляется кем-то другим, или вы даже не знаете, какие дополнительные процессы могут быть созданы и должны обрабатывать произвольные нерешенные процессы? – itowlson

+0

У нас есть собственный конкретный установщик. Однако мы также хотели бы иметь возможность обрабатывать произвольные нерешенные процессы. – tjjjohnson

ответ

6

Вы думаете об использовании WMI для решения этой проблемы?

Вы можете использовать WMI для прослушивания событий создания и удаления процесса. Хороший пример имеет вопрос 967668.

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

" SELECT * FROM Win32_Process WHERE ParentProcessId = ".

+0

спасибо за это очень полезно. – tjjjohnson

0

Было бы лучше, чтобы сделать это таким образом внутри цикла do/while:

 
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName, Environment.MachineName); 

Затем перебираем procs, чтобы узнать, что еще работает ... с использованием HasExited ...

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

Надеется, что это помогает, С наилучшими пожеланиями, Том.

+0

Это дает мне список процессов с тем же именем, что и тот, который я запустил (setup.exe). Мне интересны процессы msiexec.exe, которые порождаются этой установкой. – tjjjohnson

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