Utiliser Visual C# pour attendre la fin d’une application shell

Cet article vous montre comment utiliser la classe Microsoft .NET Framework Process pour démarrer une autre application à partir de votre code et attendre que l’autre application se ferme avant de continuer.

Version d’origine du produit : Visual C# .NET
Numéro de la base de connaissances d’origine : 305369

Résumé

Lorsque le code attend la fin de l’application, il existe deux options :

  • Attendez indéfiniment que l’autre application se termine ou soit fermée par l’utilisateur.
  • Spécifiez un délai d’attente après lequel vous pouvez fermer l’application à partir de votre code.

Cet article présente deux exemples de code qui illustrent les deux approches. En outre, l’exemple de délai d’attente permet la possibilité que l’autre application ait cessé de répondre (bloquée) et effectue les étapes nécessaires pour fermer l’application.

Cet article fait référence à l’espace de noms System.Diagnosticsde bibliothèque de classes .NET Framework suivant .

Inclure des espaces de noms

Vous devez importer l’espace de noms de la Process classe avant d’exécuter les exemples qui suivent. Placez la ligne de code suivante avant la déclaration Namespace ou Class qui contient l’exemple de code :

using System.Diagnostics;

Attendez indéfiniment la fin de l’application shell

L’exemple de code suivant démarre une autre application (dans ce cas, le Bloc-notes) et attend indéfiniment que l’application se ferme :

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

Fournir un délai d’attente pour l’application shellée

L’exemple de code suivant définit un délai d’attente pour l’application shellée. Le délai d’attente de l’exemple est défini sur 5 secondes. Vous pouvez ajuster ce nombre (qui est calculé en millisecondes) pour vos tests.

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

Résolution des problèmes

Parfois, il peut être difficile de choisir entre ces deux options. L’objectif principal d’un délai d’attente est d’empêcher votre application de se bloquer, car l’autre application s’est bloquée. Les délais d’attente sont mieux adaptés à une application shell qui effectue un traitement en arrière-plan, dans lequel l’utilisateur peut ne pas savoir que l’autre application est bloquée ou n’a pas de moyen pratique de la fermer.