Uso de Visual C# para esperar a que finalice una aplicación shell

En este artículo se muestra cómo usar la clase Microsoft .NET Framework Process para iniciar otra aplicación desde el código y hacer que el código espere a que la otra aplicación se cierre antes de que continúe.

Versión original del producto: Visual C# .NET
Número de KB original: 305369

Resumen

Cuando el código espera a que finalice la aplicación, hay dos opciones:

  • Espere indefinidamente a que el usuario finalice o cierre la otra aplicación.
  • Especifique un período de tiempo de espera después del cual puede cerrar la aplicación desde el código.

En este artículo se presentan dos ejemplos de código que muestran ambos enfoques. Además, el ejemplo de tiempo de espera permite la posibilidad de que la otra aplicación haya dejado de responder (bloqueado) y realice los pasos necesarios para cerrar la aplicación.

En este artículo se hace referencia al siguiente espacio de nombres System.Diagnosticsde biblioteca de clases de .NET Framework .

Incluir espacios de nombres

Debe importar el espacio de nombres de la Process clase antes de ejecutar los ejemplos siguientes. Coloque la siguiente línea de código antes de la declaración Namespace o Class que contiene el ejemplo de código:

using System.Diagnostics;

Espere indefinidamente a que finalice la aplicación shelled

El ejemplo de código siguiente inicia otra aplicación (en este caso, el Bloc de notas) y espera indefinidamente a que se cierre la aplicación:

//How to Wait for a Shelled Process to Finish
//Get the path to the system folder.
string sysFolder=
Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set the file name member of the process info structure.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for the window to finish loading.
p.WaitForInputIdle();
//Wait for the process to end.
p.WaitForExit();
MessageBox.Show("Code continuing...");

Proporcionar un tiempo de espera para la aplicación shell

En el ejemplo de código siguiente se establece un tiempo de espera para la aplicación shelled. El tiempo de espera del ejemplo se establece en 5 segundos. Es posible que desee ajustar este número (que se calcula en milisegundos) para las pruebas.

//Set a time-out value.
int timeOut=5000;
//Get path to system folder.
string sysFolder=
    Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set file name to open.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for window to finish loading.
p.WaitForInputIdle();
//Wait for the process to exit or time out.
p.WaitForExit(timeOut);
//Check to see if the process is still running.
if (p.HasExited == false)
    //Process is still running.
    //Test to see if the process is hung up.
    if (p.Responding)
        //Process was responding; close the main window.
        p.CloseMainWindow();
    else
        //Process was not responding; force the process to close.
        p.Kill();
    MessageBox.Show("Code continuing...");

Solución de problemas

A veces puede ser difícil elegir entre estas dos opciones. El propósito principal de un tiempo de espera es evitar que la aplicación se bloquee porque la otra aplicación se ha bloqueado. Los tiempos de espera son más adecuados para una aplicación shelled que realiza el procesamiento en segundo plano, en la que es posible que el usuario no sepa que la otra aplicación se ha detenido o no tiene una manera cómoda de cerrarla.