C#, обнаруживающий порожденные процессы

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

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

Для разъяснения вот, сценарий, из-за которого я испытываю затруднения:

  1. Запуск 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;
7
задан John Saunders 10 February 2010 в 02:21
поделиться

2 ответа

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

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

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

«SELECT * ОТ Win32_Process ГДЕ ParentProcessId = ".

6
ответ дан 7 December 2019 в 10:01
поделиться

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

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

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

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

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

0
ответ дан 7 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: