2010-02-09 4 views
7

J'écris un morceau de code C# qui lance un programme d'installation et attend qu'il revienne avant de continuer avec d'autres choses.C# Détection des processus engendrés

Je rencontre des problèmes avec certains programmes d'installation qui génèrent d'autres processus avec le processus d'origine renvoyé avant la fin de l'installation. Y at-il un moyen d'attendre que tous les processus soient terminés?

Pour clarifier ici est le scénario que je vais avoir du mal avec:

  1. Lancement Installer1
  2. Installer1 fraye/lance un autre installateur (Installer2)
  3. de retour d'installation 1
  4. application pense installer a terminé mais Installer2 est toujours en cours d'exécution. Cela provoque des problèmes avec le flux de travail dans l'application.

Voici le code que je utilise au moment:

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

Possédez-vous les processus engendrés? Par exemple. pouvez-vous modifier Installer2 si cela vous facilite la détection de l'achèvement? Ou est-ce que le programme d'installation2 est fourni par quelqu'un d'autre, ou vous ne savez même pas quels processus supplémentaires pourraient être générés et doivent gérer des processus générés arbitrairement? – itowlson

+0

Nous possédons l'installateur particulier en question. Cependant, nous aimerions aussi être capable de gérer des processus générés arbitrairement. – tjjjohnson

Répondre

6

Avez-vous pensé à utiliser WMI pour résoudre ce problème?

Vous pouvez utiliser WMI pour écouter les événements de création et de suppression de processus. La question 967668 a un bon exemple.

Lorsque vous recevez un événement de création de processus, vous pouvez émettre une requête WMI pour déterminer si le processus est un enfant (ou un enfant d'un enfant, etc.) de votre installateur racine avec quelque chose comme ce qui suit:

" SELECT * FROM Win32_Process O WH ParentProcessId = ".

+0

merci pour cela très utile. – tjjjohnson

0

Il pourrait être préférable de le faire de cette façon dans la boucle do/while:

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

Puis itérer le procs pour savoir lequel fonctionne toujours ... en utilisant la propriété HasExited ...

La logique étant que sont la propriété de votre code de sous-processus du processus, de sorte que vous pouvez vérifier d'abord si elles ont quitté ou non, sinon, garder en boucle ...

Hope this helps, Meilleures salutations, Tom.

+0

Cela m'obtient une liste de processus avec le même nom que celui que j'ai lancé (setup.exe) Je suis intéressé par les processus msiexec.exe qui sont engendrés par cette installation. – tjjjohnson

Questions connexes