2010-08-20 15 views
5

Tengo un controlador de excepción no controlada. Muestra una buena GUI y permite a los usuarios enviar un informe de error. Los usuarios pueden incluso dejar su nombre y número de teléfono y cosas, y nuestro departamento de soporte los devuelve. Funciona bien, se ve bien, enoja menos a los clientes. En teoría, de todos modos.¿Cómo suspender todos los hilos después de que se cuelgue mi programa?

El problema es que mi aplicación utiliza hilos de fondo, y a los hilos no parece importarles si se lanzó una excepción, por ejemplo, el hilo de la GUI (lo cual tiene sentido), y simplemente continúan su trabajo. Con el tiempo, esto da como resultado que aparezca un cuadro de diálogo WER si el usuario deja que la ventana del controlador de excepciones personalizado permanezca abierta el tiempo suficiente, lo que hace que parezca que el controlador de errores se bloqueó.

No tengo acceso a los objetos de subprocesos en el ámbito del controlador de excepción, por lo que no puedo suspenderlos. Hacer que los objetos de subprocesos sean accesibles globalmente tampoco es una solución. Mi solución por ahora es usar algo como Globals.Crashed = true; en mi controlador de excepciones, y hacer que mis métodos de hilos comprueben esa propiedad en cada iteración de bucle. No es perfecto, pero minimiza el daño.

¿Alguien conoce un método menos hacky? ¿Mi enfoque es incorrecto? ¿Tengo que hacerlo como lo hace WER e iniciar un programa externo que suspende el programa principal y muestra la IU de error?

+0

Si ese truco funciona lo suficientemente bien, me quedaré con él. – FrustratedWithFormsDesigner

Respuesta

5

Si tiene una excepción no controlada y no controlada, puede suponer que ALGO ha sucedido y que su programa podría dejar de hacer incluso lo más simple. Considere, por ejemplo, En el caso de que haya consumido toda la memoria disponible, tampoco podrá enviar el informe de errores, ya que probablemente requiera la asignación de memoria.

Un buen enfoque es escribir una aplicación independiente que solo realiza el informe de errores. Esa aplicación puede recoger los detalles para informar desde un archivo. De esa forma su manejador de excepciones desconocido:

  • Vuelque la información a un archivo en el directorio temporal.
  • Inicie la aplicación de informes de errores con el nombre del archivo como argumento.
  • Termine el proceso de falla, antes de que haga algo estúpido.

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

+0

Parece el mejor enfoque . Gracias. –

0

Puede rastrear todos sus hilos en un objeto de colección global, de modo que cuando su manejador se ejecute, simplemente podría iterar a través del objeto de colección y abortar los hilos allí.

+0

Creo que hubo una discusión en la última semana que tocó este tema. Déjame ver si puedo encontrar ese enlace ... Ok, aquí está: http://stackoverflow.com/questions/3480451/time-limiting-a-method-in-c – FrustratedWithFormsDesigner

0

Eche un vistazo al código en esta pregunta, Suspend Process in C#, tendrá que ajustarlo para no suspender el hilo de su GUI y cualquiera que no sean los de fondo que haya comenzado, pero debería hacer el truco .

La mejor opción, sin embargo, es intentar iniciar su GUI de informe de errores como un proceso separado, pasarle la información requerida y luego eliminar el proceso original de su controlador de excepción no controlada, en lugar de permitir que se ejecute nada un estado potencialmente corrupto.

Cuestiones relacionadas