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.
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.
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.
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 ...
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
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.
Process.WaitForExit devrait être exactement ce que vous cherchez, je pense.
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);
}