Me gustaría poder atrapar CTRL+ Cen una aplicación de consola C # para poder realizar algunas limpiezas antes de salir. Cual es la mejor manera de hacer esto?
222
Ver MSDN:
Artículo con ejemplos de código:
CancelKeyPress
solo se menciona brevemente en los comentarios. Un buen artículo es codeneverwritten.com/2006/10/…El evento Console.CancelKeyPress se utiliza para esto. Así es como se usa:
Cuando el usuario presiona Ctrl + C, se ejecuta el código en el delegado y se cierra el programa. Esto le permite realizar la limpieza llamando a los métodos necesarios. Tenga en cuenta que no hay código después de que se ejecuta el delegado.
Hay otras situaciones en las que esto no es suficiente. Por ejemplo, si el programa está realizando cálculos importantes que no se pueden detener de inmediato. En ese caso, la estrategia correcta podría ser decirle al programa que salga después de que se complete el cálculo. El siguiente código da un ejemplo de cómo se puede implementar esto:
La diferencia entre este código y el primer ejemplo es que
e.Cancel
se establece en verdadero, lo que significa que la ejecución continúa después del delegado. Si se ejecuta, el programa espera a que el usuario presione Ctrl + C. Cuando eso sucede, lakeepRunning
variable cambia el valor que hace que el ciclo while salga. Esta es una manera de hacer que el programa salga con gracia.fuente
keepRunning
puede necesitar ser marcadovolatile
. De lo contrario, el hilo principal podría almacenarlo en caché en un registro de CPU y no notará el cambio de valor cuando se ejecute el delegado.ManualResetEvent
lugar de girar en unbool
.winpty dotnet run
). De lo contrario, el delegado nunca se ejecutará.Me gustaría agregar a la respuesta de Jonas . Girar sobre un
bool
causará un 100% de utilización de la CPU y desperdiciará un montón de energía sin hacer nada mientras espera CTRL+ C.La mejor solución es usar a
ManualResetEvent
para "esperar" realmente el CTRL+ C:fuente
Aquí hay un ejemplo de trabajo completo. pegar en proyecto de consola C # vacío:
fuente
Esta pregunta es muy similar a:
Capture la salida de la consola C #
Así es como resolví este problema y traté con el usuario presionando la X y Ctrl-C. Observe el uso de ManualResetEvents. Esto hará que el subproceso principal se suspenda, lo que libera a la CPU para procesar otros subprocesos mientras espera la salida o la limpieza. NOTA: es necesario establecer TerminationCompletedEvent al final de main. De lo contrario, se produce una latencia innecesaria en la finalización debido al tiempo de espera del sistema operativo mientras se cierra la aplicación.
fuente
Console.TreatControlCAsInput = true;
ha trabajado para mifuente
Lo que en dotnet C # es necesaria para que - por lo que llamó la cancelación símbolo pasó a
Host.RunAsync(ct)
y, a continuación, en las trampas de las señales de salida, para Windows sería...
fuente