Pregunta

I tiene un manejador de excepción no controlada. Muestra una interfaz gráfica de usuario agradable y permite a los usuarios enviar un informe de error. Los usuarios pueden incluso dejar su nombre y número de teléfono y las cosas, y nuestro departamento de soporte llamadas de vuelta. Funciona bien, se ve bien, hace que los clientes menos enojado. En teoría, al menos.

El problema es que mis hilos usos de aplicaciones de fondo y los hilos no parece que les importa si una excepción fue lanzado en, por ejemplo, el hilo de interfaz gráfica de usuario (que tiene sentido), y simplemente continuar con su trabajo. Que con el tiempo los resultados en un cuadro de diálogo WER poping si el usuario deja mi costumbre gestor de excepciones ventana abierta estancia suficientemente largo, lo que hace que parezca que el gestor de errores en sí estrelló.

No tengo acceso a los objetos de hilo en el ámbito de la gestión de excepciones, así que no puedo suspenderlos. Haciendo que los objetos de rosca accesible a nivel mundial no es una solución. Mi solución por ahora es usar algo como Globals.Crashed = true; en mi gestor de excepciones, y que mis métodos de rosca comprobar que la propiedad en cada iteración del bucle. No es perfecto, pero minimiza el daño.

¿Alguien sabe un método menos hacky-? Es mi enfoque equivocado? ¿Tengo que hacerlo como lo hace WER y poner en marcha un programa externo que suspende el programa principal y muestra la interfaz de usuario de error?

¿Fue útil?

Solución

Si usted tiene una excepción no controlada, desconocida, se puede asumir que cualquier cosa tiene acaecer y que su programa podría dejar de hacer, incluso lo más simple. Considere, por ejemplo, el caso que se ha consumido toda la memoria disponible -., entonces no será capaz de enviar el informe de errores, ya sea, ya que probablemente requiere memoria que se asignará

Un enfoque bien es escribir un separada pequeña aplicación que sólo lo hace el informe de errores. Esta solicitud puede recoger los datos para informar desde un archivo. De esa manera su manejador de excepción desconocida haría:

  • volcar la información en un archivo en el directorio temporal.
  • Inicie el informe de errores de aplicaciones con el nombre de archivo como argumento.
  • terminar el proceso en su defecto, antes de que haga algo estúpido.

El archivo temporal debe ser retirado por la aplicación de los informes de errores.

Otros consejos

Se podría realizar un seguimiento de todos sus hilos en un objeto de colección global, por lo que cuando se ejecuta sus manipuladores, simplemente podría iterar a través del objeto de colección y abortar los hilos allí.

Tome un vistazo al código en esta pregunta, suspensión del proceso en C # ,' ll necesidad de retocarlo con el fin de no suspender el hilo GUI y las que no son los antecedentes que haya comenzado, pero debe hacer el truco.

La mejor opción, sin embargo, es tratar de poner en marcha su interfaz gráfica de usuario informe de errores como un proceso separado, pasando toda la información necesaria a la misma, y ??luego matar el proceso original de su manejador de excepción no controlada, en lugar de permitir que nada se ejecute en una potencialmente estado corrupto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top