2010-02-09 19 views
7

Escribo un código C# que inicia un instalador y espera a que vuelva antes de continuar con otras cosas.C# Detección de procesos engendrados

Tengo problemas con ciertos instaladores que generan otros procesos devolviendo el proceso original antes de que la instalación haya finalizado. ¿Hay alguna manera de que pueda esperar hasta que todos los procesos hayan terminado?

Para aclarar Este es el escenario que estoy teniendo problemas con:

  1. lanzamiento Installer1
  2. Installer1 genera/lanza otro instalador (Installer2)
  3. Instalador 1 vuelve
  4. Aplicación piensa instalar tiene terminado, pero Installer2 aún se está ejecutando. Esto causa problemas con el flujo de trabajo en la aplicación.

Aquí está el código que estoy usando en la actualidad

// 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

¿Eres el propietario de los procesos engendrados? P.ej. ¿Puedes modificar Installer2 si eso te ayuda a detectar la finalización? ¿O el instalador2 es suministrado por otra persona, o usted ni siquiera sabe qué procesos adicionales podrían engendrarse y necesita manejar procesos engendrados arbitrarios? – itowlson

+0

Tenemos el instalador particular en cuestión. Sin embargo, también nos gustaría poder manejar procesos generados arbitrariamente. – tjjjohnson

Respuesta

6

¿Ha pensado en usar WMI para resolver este problema?

Puede usar WMI para escuchar eventos de creación y eliminación de procesos. La pregunta 967668 tiene un buen ejemplo.

Cuando recibe un evento de creación de procesos, puede emitir una consulta WMI para determinar si el proceso es un niño (o un niño de un niño, etc.) de su instalador raíz con algo como lo siguiente:

" SELECT * FROM Win32_Process WHERE ParentProcessId = ".

+0

gracias por eso muy útil. – tjjjohnson

0

Tal vez sería mejor hacerlo de esta manera dentro de la do/while bucle:

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

iterar a través el procs para averiguar cuál sigue ejecutándose ... mediante el uso de la propiedad HasExited ...

La lógica es que los subprocesos del proceso son propiedad de su código, por lo que podría comprobar primero si han salido o no, si no, seguirá sonando ...

Espero que esto ayude, Saludos cordiales, Tom .

+0

Eso me da una lista de procesos con el mismo nombre que el que lancé (setup.exe). Me interesan los procesos msiexec.exe generados por esa configuración. – tjjjohnson

Cuestiones relacionadas