System.Diagnostics.Process.Start dziwne zachowanie
Piszę aplikację do uruchamiania i monitorowania innych aplikacji w języku C #. Korzystam z klasy System.Diagnostics.Process, aby uruchomić aplikacje, a następnie monitorować aplikacje za pomocą właściwości Process.Responding, aby odpytywać stan aplikacji co 100 milisecs. Używam Process.CloseMainWindow, aby zatrzymać aplikację lub Process.Kill, aby ją zabić, jeśli nie odpowiada.
Zauważyłem dziwne zachowanie, w którym czasami obiekt procesu przechodzi w stan, w którym właściwość odpowiadająca zawsze zwraca wartość true, nawet gdy proces bazowy zawiesza się w pętli i nie odpowiada na CloseMainWindow.
Jednym ze sposobów odtworzenia jest sondowanie właściwości Responding zaraz po uruchomieniu instancji procesu. Na przykład
_process.Start();
bool responding = _process.Responding;
odtwarza stan błędu podczas
_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;
będzie działać. Zmniejszenie okresu uśpienia do 500 spowoduje ponowne wprowadzenie stanu błędu.
Coś w wywoływaniu _process.Spondowanie zbyt szybko po uruchomieniu wydaje się uniemożliwiać obiektowi uzyskanie odpowiedniego programu do obsługi kolejek wiadomości systemu Windows. Myślę, że muszę poczekać na _process.Start, aby zakończyć pracę asynchroniczną. Czy jest lepszy sposób na czekanie na to niż wywołanie Thread.Sleep? Nie jestem przekonany, że 1000 ms zawsze będzie wystarczające.