Ten kod działa zgodnie z oczekiwaniami na dużej liczbie komputerów. Jednak na jednej konkretnej maszynie wywołanie WaitForExit()
wydaje się być ignorowane, a w rzeczywistości oznacza proces jako zakończony.Process.WaitForExit niespójne na różnych komputerach
static void Main(string[] args)
{
Process proc = Process.Start("notepad.exe");
Console.WriteLine(proc.HasExited); //Always False
proc.WaitForExit(); //Blocks on all but one machines
Console.WriteLine(proc.HasExited); //**See comment below
Console.ReadLine();
}
Należy zauważyć, że w przeciwieństwie do similar question WŁĄCZONYM tak, proces nazywany jest notepad.exe
(z powodów testowych), tak że jest mało prawdopodobne, że usterka znajduje się z nim - to znaczy nie jest tarło drugi podproces i zamykanie. Mimo to nie wyjaśniałoby, dlaczego działa na wszystkich innych maszynach.
Na komputerze problemowym drugie wywołanie Console.WriteLine(proc.HasExited))
zwraca true
, mimo że notatnik nadal jest wyraźnie otwarty, zarówno na ekranie, jak i w menedżerze zadań.
Urządzenie pracuje w systemie Windows 7 i .NET 4.0.
Moje pytanie brzmi; jakie warunki na tej konkretnej maszynie mogą być przyczyną tego? Co powinienem sprawdzić?
Edit - Czego próbowałem tak daleko/poprawki/prawdopodobnie istotnych informacji:
- ponownej instalacji .NET.
- Zamknął wszelkie procesy, których nie znam w menedżerze zadań.
- System Windows nie został jeszcze aktywowany na tym komputerze.
- Po otrzymaniu porady w komentarzach, próbowałem uzyskać "istniejący" identyfikator procesu za pomocą
GetProcessesByName
, ale to po prostu zwraca pustą tablicę na maszynie problemu. Dlatego trudno jest powiedzieć, że problem jest nawet zWaitForExit
, ponieważ proces nie jest zwracany przez wywołanieGetProcessesByName
nawet przed wywołaniemWaitForExit
. - Na problematycznym komputerze wynikowy identyfikator procesu notatnika jest identyfikatorem procesu notatnika, który ręcznie uruchamia kod, lub innymi słowy, notatnik tworzy proces potomny i kończy działanie.
Czy to możliwe, że wcześniej był otwarty inny Notatnik? Więc tworzysz jedną, zabijasz, ale wciąż widzisz stary Notatnik? 'proc.WaitForExit()' może natychmiast wrócić, jeśli proces nie mógł zostać utworzony lub został zakończony od razu z powodu pewnych powodów, na przykład brak przywilejów oryginalnego kodu do tworzenia nowych procesów. – oleksii
@oleskii, nie upewniłem się o tym. Notatnik jest tutaj używany tylko jako proces "każdy wie", ten problem występuje bez względu na to, który plik jest używany w procesie. – Rotem
@oleskii "proc.WaitForExit() może natychmiast powrócić, jeśli proces nie mógł zostać utworzony lub został zakończony od razu z powodu pewnych powodów" - czy proces nie zostałby w takim przypadku faktycznie zakończony? – Rotem