2012-03-02 14 views

Respuesta

11

Respuesta corta: Es hacer nada después CTRL-C

Respuesta larga: Hay buen artículo sobre él en la MSDN que establece claramente, que envía una señal (interrupción) en lugar de pulsación de tecla -eventos.

También hay un cancelKeyPress-Event activado que puede suscribirse y hacer lo que quiera!

Desafortunadamente no hay más información acerca de lo que se hace de manera predeterminada. Quizás en el peor de los casos, puedes comprobarlo por ti mismo. Sin embargo, la OMI debe haber algún tipo de documentación al respecto ...

ACTUALIZACIÓN: Alois Kraus escribió un codeproject-Article sobre gracia shuting por una consola de aplicación después de recibir CTRL-C.

Para citar Alois Kraus:

El comportamiento predeterminado del CLR es no hacer nada. Esto significa que el CLR recibe una notificación muy tarde mediante una notificación DLL_PROCESS_DETACH en cuyo contexto ya no se puede ejecutar ningún código administrado porque el bloqueo del cargador del sistema operativo ya se ha realizado. Nos queda la desafortunada situación de que no recibimos eventos de notificación ni ejecutamos ningún finalizador. Todos los subprocesos son asesinados silenciosamente sin posibilidad de ejecutar sus bloques catch/finally para hacer un apagado ordenado. Dije en la primera oración por defecto, porque hay una manera de manejar esta situación con gracia. La clase Console tiene un nuevo miembro de evento con .NET 2.0: Console.CancelKeyPress. Le permite recibir notificaciones de las teclas Ctrl-C y Ctrl-Break donde puede detener el apagado (solo para Ctrl-C, pero no Ctrl-Break). El principal problema aquí es si coges el evento Ctrl-C/Break y sales del controlador no hay finalizadores llamados. Esto no es lo que yo llamaría un cierre cooperativo. Lo primero que me viene a la mente es llamar a Environment.Exit pero no desencadena ningún finalizador. No todo está perdido. Hice un truco sucio para ejecutar todos los finalizadores: desplegamos un pequeño hilo de ayuda dentro del controlador de eventos que luego llamará a Environment.Exit. Voila, se llaman nuestros finalizadores.

Cuestiones relacionadas