2010-08-17 21 views
12

¿Hay alguna posibilidad de verificar desde el código si otro proceso no responde?¿Cómo comprobar si el proceso no responde?

El problema es que incluso si la aplicación se cuelga y en la lista del administrador está marcada como 'No responde', la propiedad Process.Responding todavía está devolviendo 'verdadero'.

El evento 'Salir' y la función 'WaitForExit' hacen cualquier acción si el proceso es - lo que está claro - salió. Entonces no es el punto.

Problema en dos palabras; Necesito saber que la aplicación se ha bloqueado. ¿Cómo verificarlo desde el código?

Gracias por su tiempo.

+1

¿El otro proceso tiene una ventana principal (visible)? Esto es requerido por 'Process.Responding', ver http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx –

+0

mi aplicación necesita verificar el otro proceso, definido por el usuario en el tiempo de ejecución. así que no sé si es, por ejemplo, una aplicación de consola. – futurlo

+3

Aparte de la heurística Administradores de tareas para aplicaciones de GUI (IIRC: ¿procesa un mensaje WN_NULL de manera oportuna) no hay una forma general de determinar "bloqueado" (por ejemplo, podría estar esperando algo o ocupado haciendo trabajo). – Richard

Respuesta

19

No hay una solución general a este problema.

Es imposible determinar si un proceso en particular está colgado o no, porque el término "colgado" depende completamente del contexto del proceso que se está ejecutando.

El proceso de colgado siempre hará lo que estaba codificado para hacer. El desarrollador puede haberlo codificado mal, pero Windows no puede hacer suposiciones sobre lo que está bien/mal.

las ideas posibles para tratar podrían ser:

  1. La llamada Process.Responding indicarán si es o no un proceso que se está ejecutando un bucle de mensajes ventanas está respondiendo.

  2. Una posible solución para el caso más general podría ser sondear el uso de memoria para el proceso a intervalos y si no cambia después de suficiente tiempo, suponga que está colgado. Puede hacer esto con Process.WorkingSet64. Sin embargo, espero que esto provoque una cantidad de falsos positivos: los procesos estables que no están procesando nada podrían parecer suspendidos. También causaría falsos negativos cuando un proceso de colgado que tenía una pérdida de memoria pareciera estar haciendo algo útil, cuando en realidad estaba atascado en un bucle.

  3. Si el proceso se escribe en las corrientes StandardError/StandardOutput (como muchas aplicaciones de consola hacen), entonces se podría tratar de escuchar para tal salida: Process.BeginOutputReadLine y Process.BeginErrorReadLine. Si no hay tal salida dentro de un período determinado, puede deducir que se ha colgado.

Pero no encontrará nada que funcione en el caso general.

Cuestiones relacionadas