2008-10-14 14 views
8

¿Cuál es la mejor forma de mantener abierta una aplicación de consola mientras no se haya activado el evento CancelKeyPress?¿Cómo puedo mantener abierta una consola hasta que se active el evento CancelKeyPress?

Preferiría no usar Console.Read o Console.ReadLine ya que no quiero aceptar entradas. 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.

+0

Supongo que "cerrar la aplicación correctamente" es la parte con la que está luchando aquí. De lo contrario, su aplicación se cerrará automáticamente en ctrl-c. Deberías cambiar el título. – TheSoftwareJedi

+1

No, lo que estaba teniendo problemas es "la mejor manera de mantener abierta la aplicación de la consola siempre que el evento CancelKeyPress no se haya activado" como dice la pregunta :) –

Respuesta

10

Estoy asumiendo que "cerrar sin problemas la aplicación" es la parte que está luchando con 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. No estoy seguro exactamente lo que necesita, sin embargo, así que voy a plantear esta ...

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..."); 
    } 

} 
+0

Estaba buscando más cuál era la mejor manera de mantener una consola abierta sin pedir entrada. Manejo el evento CancelKeyPress para cerrar con gracia. Thread.Sleep parece ser la mejor manera de hacer esto. –

+1

Es más el bucle while que el sueño. – ICR

1

Ya existe 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 se cierre la aplicación.

En su situación, simplemente ponga 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 use toneladas de CPU sin hacer nada.

3

El _s_stop booleano debe declararse volátil en el código de ejemplo, o un optimizador excesivamente ambicioso podría hacer que el programa para enlazar infinitamente

+0

No había oído hablar de esto antes en .NET ¿tiene un enlace que describa que se marque algo como volátil? –

1

Simplemente ejecute su programa o códigos sin depuración, en su clave de teclado en CTRL + f5 en lugar de F5 (depuración).

Cuestiones relacionadas