C # Обнаружение порожденных процессов - PullRequest
7 голосов
/ 09 февраля 2010

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

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

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

  1. Launch Installer1
  2. Installer1 порождает / запускает другой установщик (Installer2)
  3. Установщик 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;

Ответы [ 2 ]

6 голосов
/ 10 февраля 2010

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

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

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

"SELECT * FROM Win32_Process WHERE ParentProcessId =".

0 голосов
/ 09 февраля 2010

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

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

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

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

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

...