web-dev-qa-db-fra.com

Attendre la fin d'un processus

J'ai une application qui fait

Process.Start()

pour démarrer une autre application 'ABC'. Je veux attendre la fin de cette application (le processus est mort) et continuer mon exécution. Comment puis-je le faire?

Il peut y avoir plusieurs instances de l'application 'ABC' s'exécutant en même temps.

177
NLV

Je pense que vous voulez juste ceci:

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

Voir la page MSDN pour la méthode. Il y a également une surcharge dans laquelle vous pouvez spécifier le délai d'expiration afin que vous n'attendiez pas potentiellement indéfiniment.

360
Noldorin

Utilisez Process.WaitForExit ? Ou abonnez-vous à l'événement Process.Exited si vous ne voulez pas bloquer? Si cela ne vous convient pas, donnez-nous plus d'informations sur vos besoins.

124
Jon Skeet

Je fais ce qui suit dans ma candidature:

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.

Il y a quelques fonctionnalités supplémentaires dans ce que vous pourriez trouver utile ...

33
AnthonyLambert

Vous pouvez utiliser wait for exit ou attraper la propriété HasExited et mettre à jour votre interface utilisateur pour tenir l'utilisateur "informé" (gestion des attentes):

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

J'ai eu un cas où Process.HasExited n'a pas changé après la fermeture de la fenêtre appartenant au processus. Donc, Process.WaitForExit() n'a pas fonctionné non plus. Je devais surveiller Process.Responding qui passait à false après avoir fermé la fenêtre comme ça:

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

Peut-être que cela aide quelqu'un.

7
Buka

Process.WaitForExit devrait être exactement ce que vous cherchez, je pense.

5
Hans Olsson

Comme Jon Skeet le dit, utilisez le 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
David Lopes