2010-08-17 13 views
12

Gibt es eine Möglichkeit, von Code zu überprüfen, wenn ein anderer Prozess nicht antwortet?Wie überprüft man, ob der Prozess nicht reagiert?

Das Problem ist, selbst wenn die App abgestürzt ist und auf der Manager-Liste als "Nicht reagiert" markiert ist, die Process.Responding Eigenschaft gibt immer noch 'wahr' zurück.

Das Ereignis 'Exited' und die Funktion 'WaitForExit' führen Aktionen aus, wenn der Prozess "cleared exited" ist. Darum geht es nicht.

Problem in zwei Worten; Ich muss wissen, dass die Anwendung abgestürzt ist. Wie man es vom Code überprüft?

Vielen Dank für Ihre Zeit.

+1

Hat der andere Prozess ein (sichtbares) Hauptfenster? Dies wird von 'Process.Responding' benötigt, siehe http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx –

+0

Meine Anwendung muss den anderen Prozess überprüfen, der vom Benutzer definiert wurde die Laufzeit. also weiß ich nicht, ob es zum Beispiel eine Konsolen-App ist. – futurlo

+3

Anders als Task-Manager Heuristik für GUI-Anwendungen (IIRC: verarbeitet es eine WN_NULL-Nachricht in einer rechtzeitigen Weise) gibt es keine allgemeine Möglichkeit, "hängen" zu bestimmen (z. B. könnte es auf etwas warten oder beschäftigt arbeiten). – Richard

Antwort

19

Es gibt keine allgemeine Lösung für dieses Problem.

Es ist unmöglich zu sagen, ob ein bestimmter Prozess hängt oder nicht, weil der Begriff "hängen" vollständig vom Kontext des Prozesses abhängt, der ausgeführt wird.

Der hängende Prozess wird immer tun, wofür er programmiert wurde. Der Entwickler hat es möglicherweise schlecht codiert, aber Windows kann keine Annahmen darüber treffen, was richtig/falsch ist.

Mögliche Ideen könnten zu versuchen sein:

  1. Der Process.Responding Anruf wird, ob ein Prozess anzuzeigen, dass ein Windows-Meldungsschleife ausgeführt wird reagiert.

  2. Eine mögliche Lösung für den allgemeineren Fall könnte sein, die Speicherauslastung für den Prozess in Intervallen abzufragen, und wenn es sich nicht nach genügend Zeit ändert, angenommen, dass es hängt. Sie könnten dies mit Process.WorkingSet64 tun. Ich erwarte jedoch, dass dies zu einer Reihe von Fehlalarmen führen würde - stabile Prozesse, die nichts verarbeiten, scheinen zu hängen. Es würde auch falsche Negative verursachen, wo ein hängenden Prozess, der ein Speicherleck hatte, etwas Nützliches zu tun schien, obwohl es tatsächlich in einer Schleife steckte.

  3. Wenn der Prozess zu den Standarderror/StandardOutput Ströme schreibt (wie viele Konsolenanwendungen tun), dann könnten Sie versuchen, für eine solche Ausgabe hören: Process.BeginOutputReadLine und Process.BeginErrorReadLine. Wenn es innerhalb eines bestimmten Zeitraums keine solche Ausgabe gibt, könnten Sie daraus schließen, dass sie hängen geblieben ist.

Aber Sie werden nichts finden, das im allgemeinen Fall funktioniert.

Verwandte Themen