2010-05-19 3 views
9

Sto scrivendo un'app Console in C# 4 e voglio cancellare con grazia il mio programma e Ctrl + C viene premuto. Il seguente codice che ho usato molte volte prima, ma ora quando provo ad usarlo in .NET 4, sembra che si stia verificando una strana eccezione non gestita.Come utilizzare Console.CancelKeyPress in .NET 4? (Funziona bene in .NET 3.5 e seguenti)

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; 
     } 
    } 
} 

Se cambio il framework di destinazione per .NET 3.5, funziona.

EDIT: Sembra questa persona sta vedendo lo stesso problema: http://johnwheatley.wordpress.com/2010/04/14/net-4-control-c-event-handler-broken/

+0

Qual è l'eccezione? Dove succede? È possibile abilitare l'interruzione su varie eccezioni nella finestra di dialogo Eccezioni in VS (Debug -> Eccezioni o Ctrl + Alt + E). –

+0

Non è un'eccezione normale. La persona nel link che ho aggiunto lo descrive come un "errore di programma". Ecco uno screenshot di ciò che vedo premendo Ctrl + C quando il framework di destinazione è .NET 4 in esecuzione in VS 2010: http://img227.imageshack.us/img227/5871/consoletest.jpg – BigJoe714

+0

Solo un'ipotesi, ma potresti essere in grado di risolvere questo problema disabilitando il processo di hosting: fare clic con il tasto destro del mouse sul progetto, selezionare Proprietà, andare alla scheda Debug e deselezionare "Abilita il processo di hosting di Visual Studio". –

risposta

12

Questo è un problema noto su Microsoft Connect.

Nota che funziona fuori dal debugger.

+0

Grazie per le informazioni! – BigJoe714

+0

È stato risolto in VS2012 ora? – Coops

+0

in base al link, lo è – mcmillab

2

Per un'applicazione console sotto VS2010 e .NET 4.0, io sto usando il seguente (non molto pulita) soluzione:

  1. nelle proprietà del progetto, sotto [Debug], [Attiva il debug di codice non gestito];
  2. durante il codice di avvio della classe programma, inserire il seguente (questo è NET 2 stile, utilizzare lambda a vostra discrezione):

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 
} 

Anche se non è evidente, questo il codice consentirà di eseguire il debug del gestore CTRL-C in questo modo:

  1. avviare il programma sotto il debugger (F5);
  2. assicurarsi che la console del programma abbia il focus;
  3. premere ctrl + pausa (sulla mia latitudine e6500, ho bisogno di tenere premuto ctrl e Fn e F12);

Il debugger vi chiederà su questa interruzione, fare clic su [Ignora] e vi troverete nel gestore (assicurarsi un punto di interruzione è stato impostato)

lo stesso codice verrà eseguito se si preme Ctrl + C , l'unica differenza è che devi impostare e.Cancel su true.

Come sottolineato da tutti gli altri, il problema NON esiste in fase di esecuzione, questa soluzione è SOLO per passare attraverso il gestore.