Użyć Process.WaitForExit? Lub zasubskrybuj Process.Exitedwydarzenie, jeśli nie chcesz blokować? Jeśli to nie pomoże, podaj nam więcej informacji o swoich wymaganiach.
@MikeM: Właśnie dlatego wspomniałem WaitForExitpierwszy ... w niektórych przypadkach możesz chcieć wykonać więcej kodu, gdy coś się skończy, ale to nie znaczy, że musisz zablokować bieżący wątek.
Jeśli zamierzasz skorzystać ze Process.Exitedzdarzenia, uważam, że musisz wcześniej skonfigurować proces, ustawiając wartość Process.EnableRaisingEventstrue. Chociaż biorąc pod uwagę, że to pytanie ma ponad trzy lata, być może Process.EnableRaisingEventsnie było to w chwili zadawania pytania .
Process process =newProcess();
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.
Jest tam kilka dodatkowych funkcji, które mogą być przydatne ...
Możesz użyć opcji oczekiwania na wyjście lub złapać właściwość HasExited i zaktualizować interfejs użytkownika, aby użytkownik był „poinformowany” (zarządzanie oczekiwaniami):
System.Diagnostics.Process process =System.Diagnostics.Process.Start("cmd.exe");while(!process.HasExited){//update UI}//done
Miałem przypadek, w którym Process.HasExitednie zmieniłem się po zamknięciu okna należącego do procesu. Więc Process.WaitForExit()też nie działało. Process.RespondingPo zamknięciu okna musiałem monitorować, czy nie jest to fałsz:
w przeciwnym razie kod zostanie zablokowany. Również żadne dodatkowe właściwości nie są potrzebne.
// Start a process and raise an event when done.
myProcess.StartInfo.FileName= fileName;// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents=true;// Eventhandler wich fires when exited
myProcess.Exited+=newEventHandler(myProcess_Exited);// Starts the process
myProcess.Start();// Handle Exited event and display process information.privatevoid myProcess_Exited(object sender,System.EventArgs e){Console.WriteLine(
$"Exit time : {myProcess.ExitTime}\n"+
$"Exit code : {myProcess.ExitCode}\n"+
$"Elapsed time : {elapsedTime}");}
Jaki jest sens komentowania odpowiedzi na pytanie, na które już udzielono odpowiedzi, na pytanie, na które już udzielono odpowiedzi? Nie tylko zmarnowałeś własne cykle, ale także zmusiłeś mnie do marnowania kopalni.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.