Ich habe eine Anwendung, die das tut
Process.Start()
um eine andere Anwendung 'ABC' zu starten. Ich möchte warten, bis die Anwendung endet (Prozess stirbt) und die Ausführung fortsetzen. Wie kann ich es tun?
Es können mehrere Instanzen der Anwendung 'ABC' gleichzeitig ausgeführt werden.
Ich denke du willst nur das:
var process = Process.Start(...);
process.WaitForExit();
Siehe die MSDN-Seite für die Methode. Es gibt auch eine Überladung, bei der Sie das Timeout angeben können, sodass Sie möglicherweise nicht für immer warten müssen.
Verwenden Sie Process.WaitForExit
? Oder das Ereignis Process.Exited
abonnieren, wenn Sie nicht blockieren möchten? Wenn dies nicht Ihren Wünschen entspricht, geben Sie uns bitte mehr Informationen zu Ihren Anforderungen.
Ich mache in meiner Bewerbung folgendes:
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.
Es gibt ein paar zusätzliche Funktionen, die für Sie nützlich sein könnten ...
Sie können wait auf exit verwenden, oder Sie können die HasExited-Eigenschaft abrufen und Ihre Benutzeroberfläche aktualisieren, um den Benutzer "informiert" zu halten (Erwartungsmanagement):
System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
//update UI
}
//done
Ich hatte einen Fall, in dem sich Process.HasExited
nicht geändert hat, nachdem das zum Prozess gehörende Fenster geschlossen wurde. Also funktionierte Process.WaitForExit()
auch nicht. Ich musste Process.Responding
überwachen, der nach dem Schließen des Fensters auf false ging:
while (!_process.HasExited && _process.Responding) {
Thread.Sleep(100);
}
...
Vielleicht hilft das jemandem.
Process.WaitForExit sollte genau das sein, was Sie suchen, denke ich.
Wie Jon Skeet sagt, benutze den 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);
}