2012-03-06 18 views
5

Así que estoy escribiendo una aplicación que supervisa una aplicación de consola que fue escrita por otro desarrollador. La aplicación de la consola es propensa a bloquearse y porque se ejecuta toda la noche, necesito mi aplicación para reiniciarla.C# Process.exited no se llama hasta que se cierra la ventana

Desafortunadamente cuando la aplicación de la consola falla, aparece el mensaje de Windows que dice "blah ha dejado de funcionar" Y un botón que dice cerrar el programa.

Estoy usando System.Diagnostic.Process para iniciar la aplicación de la consola, pero no puedo determinar si la aplicación de la consola se ha bloqueado hasta DESPUÉS de que se pulse el botón Cerrar programa. Process.Responding siempre es verdadero (no hay identificador de ventanas) Process.exited no se activa hasta que se golpea el botón Cerrar programa.

Cualquier idea sería de gran ayuda.

Gracias

+0

No sé qué podría hacer al respecto en C#, pero una opción posible es utilizar una herramienta de automatización (como AutoIt) para hacer clic en el botón Cerrar para usted. –

+0

¿Están ambas aplicaciones escritas en .NET? –

+0

no la aplicación de la consola no está escrita con .net – user1253149

Respuesta

2

Deshabilite la función de informe de bloqueo de Windows. El núcleo lo notifica cuando falla un proceso. El proceso está activo hasta que se complete la función de informe de bloqueo.

La función se puede deshabilitar por proceso utilizando alguna API. Disabling Windows error reporting (Dr. Watson) for my process No lo deshabilite globalmente para solucionar un problema local.

+0

me deshabilité por lo que no busca una solución, pero todavía aparece una ventana emergente. – user1253149

+5

La implementación de un cambio en todo el sistema solo para una aplicación parece ser un tanto torpe. –

+0

No estaba claro en la respuesta original: la función se puede desactivar por proceso utilizando alguna API. http://stackoverflow.com/questions/1134343/disabling-windows-error-reporting-dr-watson-for-my-process – usr

0
  1. esto no es un buen caso para una aplicación de consola. Un windows service o un scheduled task sería una mejor opción.

  2. su aplicación de consola está fallando, ya que no tiene ningún error handling

  3. como dijo la otra persona, el proceso está siendo colgado por windows error reporting

Si quieres mi consejo, yendo con la poca información que tengo, asumiré que tiene como está ahora, así que ajuste todo el proceso en try/catch y trate la excepción en el bloque catch por lo que no aparece en los informes de errores de Windows. Luego llama al reinicio desde allí.

Editar: la persona recibió una respuesta suficiente, pero lo dejo para googlers. Quiero señalar que la aplicación contenedora nunca tendrá control sobre el bloqueo del proceso sin tener desactivado informe de errores de Windows, por lo que es un paso importante en el proceso.

2

Mira ProcessStartInfo.ErrorDialog = false;

0

Esto parece funcionar para mí:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo(); 
startinfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startinfo.FileName = @"PATH TO EXE"; 
startinfo.Arguments = "Arg1 Arg2 Arg3"; 
startinfo.ErrorDialog = false; 
startinfo.RedirectStandardError = true; 
startinfo.UseShellExecute = false; 
process.StartInfo = startinfo;   
process.Start(); 
process.WaitForExit(); 
process.Kill(); 
Cuestiones relacionadas