2010-06-30 3 views
149

Ho un'applicazione che faaspettare fino a quando un processo termina

Process.Start() 

per avviare un'altra applicazione 'ABC'. Voglio aspettare fino alla fine di questa applicazione (processo muore) e continuare la mia esecuzione. Come posso farlo?

Ci possono essere più istanze dell'applicazione 'ABC' in esecuzione allo stesso tempo.

risposta

306

Penso che si desidera proprio questo:

var process = Process.Start(...); 
process.WaitForExit(); 

Vedere la MSDN page per il metodo. Ha anche un sovraccarico in cui è possibile specificare il timeout, quindi non si è potenzialmente in attesa per sempre.

113

Utilizzare Process.WaitForExit? Oppure iscriviti all'evento Process.Exited se non vuoi bloccare? Se ciò non fa ciò che desideri, ti preghiamo di fornirci maggiori informazioni sulle tue esigenze.

+26

+1 per l'evento. – NLV

+1

make that +1 ++ :) – Apelsin

+0

sicuramente buone informazioni con Process.Exited, ma l'OP ha detto "wait" –

14

Si potrebbe utilizzare attendere per uscire o si può prendere la proprietà HasExited e aggiornare l'interfaccia utente per mantenere l'utente "informato" (gestione delle aspettative):

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe"); 
while (!process.HasExited) 
{ 
    //update UI 
} 
//done 
29

ho effettuare le seguenti operazioni nella mia domanda:

Process process = new Process(); 
process.StartInfo.FileName = executable; 
process.StartInfo.Arguments = arguments; 
process.StartInfo.ErrorDialog = true; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 
process.Start(); 
process.WaitForExit(1000 * 60 * 5); // Wait up to five minutes. 

ci sono alcune caratteristiche extra in là che potreste trovare utile ...

+1

no "funziona anche bene ...." – AnthonyLambert

-5

Prova questo:

string command = "..."; 
var process = Process.Start(command); 
process.WaitForExit(); 
+4

Qual è il punto che commenta una risposta a una domanda già risposta sulla domanda che sta già avendo una risposta? Non solo hai sprecato i tuoi cicli ma mi hai costretto a sprecare anche il mio. –

+0

@AdamBilinski domande e risposte sono intese per essere viste da altre persone che hanno la domanda non solo quella che ha chiesto – L3n

+4

@ L3n Sono d'accordo, ma questa risposta è esattamente la stessa della risposta accettata quindi è inutile! –

4

Avevo un caso in cui Process.HasExited non è cambiato dopo aver chiuso la finestra che appartiene al processo. Quindi anche il Process.WaitForExit() non ha funzionato. Ho dovuto monitorare Process.Responding che è andato al falso dopo aver chiuso la finestra del genere:

while (!_process.HasExited && _process.Responding) { 
    Thread.Sleep(100); 
} 
... 

Forse questo aiuta qualcuno.

0

Come dice Jon Skeet, utilizzare il Process.Exited:

proc.StartInfo.FileName = exportPath + @"\" + fileExe; 
proc.Exited += new EventHandler(myProcess_Exited); 
proc.Start(); 
inProcess = true; 

while (inProcess) 
{ 
    proc.Refresh(); 
    System.Threading.Thread.Sleep(10); 
    if (proc.HasExited) 
    { 
     inProcess = false; 
    } 
} 

private void myProcess_Exited(object sender, System.EventArgs e) 
{ 
    inProcess = false; 
    Console.WriteLine("Exit time: {0}\r\n" + 
     "Exit code: {1}\r\n", proc.ExitTime, proc.ExitCode); 
} 
+0

Non risponde veramente alla domanda. Si prega di affinare la risposta per risolvere la domanda – Grantly

+0

E ora? magari apri vb e fai la soluzione;) –