2010-06-30 30 views
149

tengo una aplicación que haceesperar hasta que un proceso termina

Process.Start() 

para iniciar otra aplicación 'ABC'. Quiero esperar hasta que la aplicación finalice (el proceso muere) y continuar mi ejecución. ¿Cómo puedo hacerlo?

Puede haber varias instancias de la aplicación 'ABC' ejecutándose al mismo tiempo.

Respuesta

306

creo que lo que desea es la siguiente:

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

Véase el MSDN page para el método. También tiene una sobrecarga en la que puede especificar el tiempo de espera, por lo que no está potencialmente esperando por siempre.

113

Use Process.WaitForExit? ¿O suscribirse al evento Process.Exited si no desea bloquear? Si eso no hace lo que desea, por favor denos más información acerca de sus requisitos.

+26

+1 para el evento. – NLV

+1

hacer que +1 ++ :) – Apelsin

+0

definitivamente buena información con Process.Exited, pero el OP dijo "esperar" –

14

Usted podría utilizar esperar para salir o se puede tomar la propiedad HasExited y actualizar la interfaz de usuario para mantener al usuario "informado" (gestión de las expectativas):

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

que hacer lo siguiente en mi solicitud:

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. 

hay algunas características adicionales en los que no le puede resultar útil ...

+1

no "también funciona bien ..." – AnthonyLambert

-5

Prueba esto:

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

¿Qué sentido tiene comentar una respuesta a una pregunta ya respondida sobre la pregunta que ya se está respondiendo? No solo has desperdiciado tus propios ciclos, sino que también me has obligado a perder los míos. –

+0

Las preguntas y respuestas de @AdamBilinski están pensadas para ser vistas por otras personas que tienen la pregunta, no solo la que preguntó – L3n

+4

@ L3n Estoy de acuerdo, pero esta respuesta es exactamente la misma que la aceptada, ¡así que no tiene sentido! –

4

Tuve un caso en el que Process.HasExited no cambió después de cerrar la ventana que pertenece al proceso. Entonces Process.WaitForExit() tampoco funcionó. Tenía que vigilar Process.Responding que fue a falsa después de cerrar la ventana de esa manera:

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

Tal vez esto ayude a alguien.

0

como Jon Skeet dice, utilice el 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

Realmente no responde la pregunta. Por favor, refine su respuesta para resolver la pregunta – Grantly

+0

¿Y ahora qué? tal vez abrir vb y hacer la solución;) –

Cuestiones relacionadas