Usar o Visual C# para aguardar a conclusão de um aplicativo com shell

Este artigo mostra como usar a classe microsoft .NET Framework Process para iniciar outro aplicativo do código e fazer com que o código aguarde o fechamento do outro aplicativo antes que ele continue.

Versão original do produto: Visual C# .NET
Número de KB original: 305369

Resumo

Quando o código aguarda a conclusão do aplicativo, há duas opções:

  • Aguarde indefinidamente para que o outro aplicativo seja concluído ou fechado pelo usuário.
  • Especifique um período de tempo limite após o qual você pode fechar o aplicativo do código.

Este artigo apresenta dois exemplos de código que demonstram ambas as abordagens. Além disso, o exemplo de tempo limite permite a possibilidade de que o outro aplicativo possa ter parado de responder (suspenso) e tomar as etapas necessárias para fechar o aplicativo.

Este artigo refere-se ao namespace System.Diagnosticsda Biblioteca de Classes .NET Framework a seguir .

Incluir namespaces

Você deve importar o namespace para a Process classe antes de executar os exemplos a seguir. Coloque a seguinte linha de código antes da declaração Namespace ou Class que contém o exemplo de código:

using System.Diagnostics;

Aguarde indefinidamente para que o aplicativo shelled seja concluído

O exemplo de código a seguir inicia outro aplicativo (nesse caso, Bloco de Notas) e aguarda indefinidamente para que o aplicativo feche:

//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...");

Fornecer um tempo limite para o aplicativo com shell

O exemplo de código a seguir define um tempo limite para o aplicativo shelled. O tempo limite para o exemplo é definido como 5 segundos. Talvez você queira ajustar esse número (que é calculado em milissegundos) para o teste.

//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...");

Solução de problemas

Às vezes, pode ser difícil escolher entre essas duas opções. A principal finalidade de um tempo limite é impedir que seu aplicativo seja suspenso porque o outro aplicativo foi suspenso. Os tempos limite são mais adequados para um aplicativo com shell que executa o processamento em segundo plano, no qual o usuário pode não saber que o outro aplicativo parou ou não tem uma maneira conveniente de fechá-lo.