it-swarm.com.de

Warten Sie, bis ein Prozess abgeschlossen ist

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.

177
NLV

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.

360
Noldorin

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.

124
Jon Skeet

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 ...

33
AnthonyLambert

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
16
riffnl

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.

7
Buka

Process.WaitForExit sollte genau das sein, was Sie suchen, denke ich.

5
Hans Olsson

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);
}
0
David Lopes