2010-05-19 12 views
9

Estoy escribiendo una aplicación de consola en C# 4 y quiero cancelar mi programa con gracia y presionar Ctrl + C. El siguiente código lo he usado muchas veces antes, pero ahora cuando trato de usarlo en .NET 4, parece que se está produciendo una extraña excepción no controlada.¿Cómo uso Console.CancelKeyPress en .NET 4? (Funciona bien en .NET 3.5 y abajo)

namespace ConsoleTest 
{ 
    class Program 
    { 
     private static bool stop = false; 

     static void Main(string[] args) 
     { 
      System.Console.TreatControlCAsInput = false; 
      System.Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress); 

      while (!stop) 
      { 
       System.Console.WriteLine("waiting..."); 
       System.Threading.Thread.Sleep(1000); 
      } 
      System.Console.WriteLine("Press any key to exit..."); 
      System.Console.ReadKey(true); 
     } 

     static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) 
     { 
      stop = true; 
      e.Cancel = true; 
     } 
    } 
} 

Si cambio el Marco de destino de .NET 3.5, funciona.

EDIT: Parece que esta persona está viendo el mismo problema: http://johnwheatley.wordpress.com/2010/04/14/net-4-control-c-event-handler-broken/

+0

¿Cuál es la excepción? ¿Dónde ocurre? Puede habilitar la interrupción de varias excepciones en el cuadro de diálogo Excepciones en VS (Depurar -> Excepciones o Ctrl + Alt + E). –

+0

No es una excepción normal. La persona en el enlace que agregué lo describe como un "error del programa". Aquí hay una captura de pantalla de lo que veo al presionar Ctrl + C cuando target framework está ejecutando .NET 4 en VS 2010: http://img227.imageshack.us/img227/5871/consoletest.jpg – BigJoe714

+0

Solo una conjetura, pero es posible que ser capaz de solucionar este problema mediante la desactivación del proceso de alojamiento: haga clic derecho en su proyecto, seleccione Propiedades, vaya a la pestaña Depuración y desmarque "Habilitar el proceso de alojamiento de Visual Studio". –

Respuesta

12

Este es un problema conocido en Microsoft Connect.

Tenga en cuenta que funciona fuera del depurador.

+0

¡Gracias por la información! – BigJoe714

+0

¿Está esto solucionado en VS2012 ahora? – Coops

+0

según el enlace, es – mcmillab

2

Para una aplicación de consola, en VS2010 y .NET 4.0, estoy usando el siguiente (no muy limpio) Solución:

  1. en Propiedades del proyecto, bajo [depuración], marque [Activar depuración de código no administrado];
  2. durante el código de inicio de su clase de programa, inserte el siguiente (este es el estilo de .NET 2, utilice lambdas a su discreción):

Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) 
{ 
    if (e.SpecialKey == ConsoleSpecialKey.ControlC) 
    { 
    e.Cancel = true; // tell the CLR to keep running 
    } 
    else if (e.SpecialKey == ConsoleSpecialKey.ControlBreak) 
    { 
    //e.Cancel = true; // "Applications are not allowed to cancel the .... 
    } 
    // do whatever you must to inform threads on application exit, etc 
} 

Aunque no es evidente, esta código le permitirá depurar su controlador CTRL-C de la siguiente manera:

  1. Inicie su programa en el depurador (F5);
  2. asegúrese de que la consola de su programa tenga el foco;
  3. presione ctrl + pausa (en mi latitud e6500, necesito mantener ctrl y Fn y F12);

El depurador le preguntará acerca de esta interrupción, haga clic en [Ignorar] y se encontrará en el controlador (asegúrese de que un punto de interrupción ha sido fijado)

el mismo código se ejecutará si se pulsa Ctrl + C , la única diferencia es que debe establecer e.Cancelar en verdadero.

Como señalaron todos los demás, el problema NO existe en el tiempo de ejecución, esta solución alternativa SÓLO para recorrer el controlador.

Cuestiones relacionadas