2010-02-09 13 views
7

Piszę fragment kodu C#, który uruchamia instalator i czeka na jego powrót, zanim przejdzie dalej.Wykrywanie spawdzonych procesów C#

Mam problem z niektórymi instalatorami, które spawnują inne procesy z pierwotnym procesem, który powrócił, zanim instalacja zakończy się. Czy jest jakiś sposób, że mogę poczekać, aż wszystkie procesy zostaną zakończone?

Aby wyjaśnić tutaj scenariusz mam problemy z:

  1. uruchamianie Installer1
  2. Installer1 ikra/uruchamia kolejną instalatora (Installer2)
  3. Installer 1 zwraca
  4. Zastosowanie myśli zainstalować ma zakończone, ale Installer2 nadal działa. Powoduje to problemy z przepływem pracy w aplikacji.

Oto kod używam w tej chwili:

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

Czy jesteś właścicielem spawnowanych procesów? Na przykład. czy możesz zmodyfikować Installer2, jeśli to ułatwiłoby ci wykrywanie ukończenia? Czy instalator2 jest dostarczany przez kogoś innego, czy nie wiesz nawet, jakie dodatkowe procesy mogą zostać uruchomione i które wymagają obsługi dowolnych procesów odradzania? – itowlson

+0

Posiadamy własny konkretny instalator. Jednak chcielibyśmy również móc obsługiwać dowolne procesy odradzania. – tjjjohnson

Odpowiedz

6

Czy zastanawiałeś się nad wykorzystaniem WMI do rozwiązania tego problemu?

Możesz użyć usługi WMI do odsłuchiwania zdarzeń związanych z tworzeniem i usuwaniem procesów. Pytanie 967668 ma dobry przykład.

Po odebraniu zdarzenia tworzenia proces, można wydać kwerendy WMI do określenia, czy proces jest dziecko (lub dziecko dziecka itd) z instalatora korzeniowego z czymś, co następuje:

" SELECT * FROM Win32_Process WHERE ParentProcessId = ".

+0

dzięki za to bardzo pomocne. – tjjjohnson

0

To może być lepiej zrobić to w ten sposób wewnątrz do/while pętli:

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

Następnie iterację procs, aby dowiedzieć się, która jest nadal uruchomiona ... za pomocą właściwości HasExited ...

Logika jest, że podprocesów procesu są własnością kodzie, więc można najpierw sprawdzić, czy wyjdą czy nie, a jeśli nie, zachować zapętlenie ...

Nadzieja to pomaga, poważaniem Toma.

+0

To daje mi listę procesów o tej samej nazwie, co uruchomiłem (setup.exe). Interesują mnie procesy msiexec.exe, które są tworzone przez tę konfigurację. – tjjjohnson