2010-02-09 5 views
7

Ich schreibe ein Stück C# -Code, das ein Installationsprogramm startet und darauf wartet, dass es zurückkehrt, bevor es mit anderen Dingen fortfährt.C# Erkennen von erzeugten Prozessen

Ich habe Probleme mit bestimmten Installern, die andere Prozesse mit dem ursprünglichen Prozess spawnen, bevor die Installation tatsächlich abgeschlossen ist. Gibt es einen Weg, auf den ich warten kann, bis alle Prozesse abgeschlossen sind?

hier Um zu klären, ist das Szenario, das ich Probleme mit, die ich:

  1. Einführung Installer1
  2. Installer1 laicht/startet ein weiteres Installationsprogramm (Installer2)
  3. Installer 1 kehrt
  4. Anwendung hat denkt installieren fertig, aber Installer2 läuft noch. Dies führt zu Problemen mit dem Workflow in der App.

Hier ist der Code, den ich im Moment bin mit:

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

Besitzen Sie die erzeugten Prozesse? Z.B. Können Sie Installer2 ändern, wenn dies die Erkennung der Vervollständigung erleichtern würde? Oder wird Installer2 von jemand anderem zur Verfügung gestellt, oder Sie wissen nicht einmal, welche zusätzlichen Prozesse generiert werden können und müssen mit freigewordenen Prozessen umgehen? – itowlson

+0

Wir besitzen das betreffende Installationsprogramm. Wir möchten jedoch auch beliebige frei gewordene Prozesse handhaben können. – tjjjohnson

Antwort

6

Haben Sie über die Verwendung von WMI zur Lösung dieses Problems nachgedacht?

Sie können WMI verwenden, um auf Prozesse zum Erstellen und Löschen von Prozessen zu warten. Frage 967668 hat ein gutes Beispiel.

Wenn Sie eine Prozesserstellung Ereignis erhalten, können Sie eine WMI-Abfrage aus, um zu bestimmen, ob der Prozess ein Kind (oder ein Kind eines Kindes usw.) Ihres Root-Installer mit so etwas wie die folgenden:

" SELECT * FROM Win32_Process WHERE ParentProcessId = ".

+0

vielen Dank dafür sehr hilfreich. – tjjjohnson

0

Es könnte besser sein, es in der do/while Schleife auf diese Weise zu tun:

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

Dann iterieren die procs, um herauszufinden, die noch läuft ... mit der HasExited Eigenschaft ...

Die Logik ist, dass die Teilprozesse des Prozesses von Ihrem Code sind im Besitz, so dass Sie zunächst prüfen könnten, wenn sie verlassen haben oder nicht, wenn nicht, halten Looping ...

hoffe, das hilft, Mit freundlichen Grüßen, Tom.

+0

Das bringt mir eine Liste von Prozessen mit dem gleichen Namen wie die, die ich gestartet habe (setup.exe) Ich bin interessiert an den msiexec.exe-Prozessen, die von dieser Einrichtung hervorgebracht werden. – tjjjohnson