Я пишу часть кода c#, который запускает установщик и ожидает его для возврата прежде, чем продолжить другой материал.
Я испытываю затруднения из-за определенных установщиков, которые порождают другие процессы с исходным процессом, возвращаясь, прежде чем установка будет иметь фактический законченный. Есть ли некоторый способ, которым я могу ожидать, пока все процессы не закончились?
Для разъяснения вот, сценарий, из-за которого я испытываю затруднения:
Вот код, который я использую в данный момент:
// 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;
Вы думали об использовании WMI для решения этой проблемы?
Вы можете использовать WMI для прослушивания событий создания и удаления процессов. Вопрос 967668 содержит хороший пример.
Когда вы получаете событие создания процесса, вы можете отправить WMI-запрос, чтобы определить, является ли процесс дочерним (или дочерним по отношению к дочернему элементу и т. Д.) Вашего корневого установщика, примерно следующим образом:
«SELECT * ОТ Win32_Process ГДЕ ParentProcessId = ".
Может быть лучше сделать это внутри do
/ пока
цикл:
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName, Environment.MachineName);
Затем через procs
выполняется итерация, чтобы выяснить, какая из них все еще выполняется. используя свойство HasExited
...
Логика заключается в том, что подпроцессы процесса принадлежат вашему коду, так что вы можете сначала проверить, вышли ли они из процесса или нет, если нет, то продолжайте петлять...
Надеюсь, это поможет, С наилучшими пожеланиями, Том.