2010-02-09 5 views
7

Sto scrivendo un pezzo di codice C# che avvia un programma di installazione e attende che venga restituito prima di continuare con altre cose.C# Rilevamento di processi generati

Ho problemi con alcuni programmi di installazione che generano altri processi con il processo originale che ritorna prima della fine dell'installazione. C'è un modo che posso aspettare fino al termine di tutti i processi?

Per chiarire Ecco lo scenario che sto avendo problemi con:

  1. lancio Installer1
  2. Installer1 genera/lancia un altro installatore (Installer2)
  3. Installer 1 restituisce
  4. Applicazione pensa installare ha finito ma Installer2 è ancora in esecuzione. Ciò causa problemi con il flusso di lavoro nell'app.

Ecco il codice che sto utilizzando in questo momento:

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

Sei proprietario dei processi generati? Per esempio. puoi modificare Installer2 se questo ti renderebbe più facile il rilevamento del completamento? Oppure l'Installer2 è fornito da qualcun altro, o non sai nemmeno quali processi aggiuntivi potrebbero essere generati e devi gestire processi generati arbitrariamente? – itowlson

+0

Siamo proprietari del particolare programma di installazione in questione. Tuttavia vorremmo anche essere in grado di gestire processi generati arbitrariamente. – tjjjohnson

risposta

6

Hai mai pensato di utilizzare WMI per risolvere questo problema?

È possibile utilizzare WMI per ascoltare la creazione del processo e gli eventi di cancellazione. Domanda 967668 ha un buon esempio.

Quando si riceve un evento di creazione processo, si potrebbe emettere una query WMI per determinare se il processo è un bambino (o un figlio di un figlio, ecc) del vostro installatore radice con qualcosa come il seguente:

" SELECT * FROM Win32_Process WHERE ParentProcessId = ".

+0

grazie per quello molto utile. – tjjjohnson

0

Potrebbe essere meglio farlo in questo modo all'interno della do/while ciclo:

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

Poi scorrere il procs per scoprire che è ancora in esecuzione ... utilizzando la proprietà ...

La logica è che sottoprocessi del processo sono di proprietà di codice, così da poter controllare prima se essi sono usciti o no, in caso contrario, continuerà in loop ...

Spero che questo aiuti, i migliori saluti, Tom.

+0

Mi viene fornito un elenco di processi con lo stesso nome di quello che ho avviato (setup.exe). Sono interessato ai processi msiexec.exe generati da tale impostazione. – tjjjohnson