visual - imprimir en consola c#
¿Cómo puedo mantener abierta una consola hasta que se active el evento CancelKeyPress? (5)
Esto puede ser lo que estás buscando:
http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress.aspx
¿Cuál es la mejor manera de mantener abierta una aplicación de consola siempre que no se haya activado el evento CancelKeyPress?
Preferiría no usar Console.Read o Console.ReadLine ya que no quiero aceptar entrada. Solo quiero permitir que la aplicación subyacente imprima en los detalles del evento de la consola a medida que se disparan. Luego, una vez que se active el evento CancelKeyPress, deseo cerrar la aplicación con gracia.
Ya hay un controlador vinculado a CancelKeyPress que finaliza su aplicación, la única razón para conectarse es si desea interceptar el evento y evitar que la aplicación se cierre.
En su situación, simplemente coloque su aplicación en un bucle infinito y deje que el controlador de eventos incorporado lo mate. Es posible que desee considerar el uso de algo como Wait (1) o un proceso en segundo plano para evitar que utilice toneladas de CPU sin hacer nada.
Asumo que "cerrar con gracia la aplicación" es la parte con la que estás luchando aquí. De lo contrario, su aplicación se cerrará automáticamente en ctrl-c. Deberías cambiar el título.
Aquí hay una demostración rápida de lo que creo que necesita. Se podría refinar un poco más con el uso de bloqueo y Monitores para notificación. Aunque no estoy seguro de qué es exactamente lo que necesitas, así que solo posaré esto ...
class Program
{
private static bool _s_stop = false;
public static void Main(string[] args)
{
Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
while (!_s_stop)
{
/* put real logic here */
Console.WriteLine("still running at {0}", DateTime.Now);
Thread.Sleep(3000);
}
Console.WriteLine("Graceful shut down code here...");
//don''t leave this... demonstration purposes only...
Console.ReadLine();
}
static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
//you have 2 options here, leave e.Cancel set to false and just handle any
//graceful shutdown that you can while in here, or set a flag to notify the other
//thread at the next check that it''s to shut down. I''ll do the 2nd option
e.Cancel = true;
_s_stop = true;
Console.WriteLine("CancelKeyPress fired...");
}
}
El booleano _s_stop
debe declararse como volátil en el código de ejemplo, o un optimizador excesivamente ambicioso puede hacer que el programa buclee infinitamente.
Simplemente ejecute su programa o códigos sin depuración, en la tecla del teclado en CTRL + f5 en lugar de F5 (depuración).