Espere hasta que finalice un proceso

Tengo una aplicación que no

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.

Creo que solo quieres esto:

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

Vea la página de MSDN 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.

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.

Hago lo siguiente en mi aplicación:

 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 que pueden serle útiles …

Puede usar esperar para salir o puede atrapar la propiedad HasExited y actualizar su UI para mantener al usuario “informado” (gestión de expectativas):

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

Process.WaitForExit debería ser justo lo que está buscando, creo.

Tuve un caso donde Process.HasExited no cambió después de cerrar la ventana que pertenece al proceso. Así que Process.WaitForExit() tampoco funcionó. Tuve que supervisar Process.Responding que pasó a falso después de cerrar la ventana de esa manera:

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

Tal vez esto ayude a alguien.

Como dice Jon Skeet, usa el Process.Exited . 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); } 

Prueba esto:

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