2010-05-19 4 views
9

J'écris une application de console en C# 4 et je veux annuler mon programme gracieusement et Ctrl + C est pressé. Le code suivant que j'ai utilisé plusieurs fois auparavant, mais maintenant en essayant de l'utiliser dans .NET 4, il semble qu'une exception non gérée étrange se produise.Comment utiliser Console.CancelKeyPress dans .NET 4? (Fonctionne bien dans .NET 3.5 et ci-dessous)

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 je change le Framework cible à .NET 3.5, il fonctionne.

EDIT: Il semble que cette personne voit la même question: http://johnwheatley.wordpress.com/2010/04/14/net-4-control-c-event-handler-broken/

+0

Quelle est l'exception? Où cela arrive-t-il? Vous pouvez activer la rupture sur diverses exceptions dans la boîte de dialogue Exceptions dans VS (Debug -> Exceptions ou Ctrl + Alt + E). –

+0

Ce n'est pas une exception normale. La personne dans le lien que j'ai ajouté le décrit comme une "faute de programme". Voici une capture d'écran de ce que je vois en appuyant sur Ctrl + C lorsque le framework cible est .NET 4 fonctionnant dans VS 2010: http://img227.imageshack.us/img227/5871/consoletest.jpg – BigJoe714

+0

Juste une supposition, mais vous pourriez être capable de contourner ce problème en désactivant le processus d'hébergement: cliquez-droit sur votre projet, sélectionnez Propriétés, allez à l'onglet Déboguer, et décochez "Activer le processus d'hébergement Visual Studio". –

Répondre

12

Ceci est un problème connu sur Microsoft Connect.

Notez que cela fonctionne en dehors du débogueur.

+0

Merci pour l'info! – BigJoe714

+0

Est-ce que c'est maintenant réglé dans VS2012? – Coops

+0

selon le lien, il est – mcmillab

2

Pour une application console sous VS2010 et .NET 4.0, je suis en utilisant les éléments suivants (pas très propre) solution de contournement:

  1. dans les propriétés du projet, sous [Debug], cochez la case [Activer le débogage de code non managé];
  2. pendant le code de démarrage de votre classe de programme, insérer ce qui suit (ce qui est le style .NET 2, utilisez lambdas à votre discrétion):

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 
} 

Bien que pas évident, ce code vous permettra de déboguer votre gestionnaire CTRL-C comme suit:

  1. démarrer votre programme sous le débogueur (F5);
  2. Assurez-vous que la console de votre programme a le focus; Appuyez sur ctrl + pause (sur ma latitude e6500, j'ai besoin de ctrl et Fn et F12);

Le débogueur vous demandera de cette interruption, cliquez sur [Ignorer] et vous vous trouverez dans le gestionnaire (assurez-vous un point d'arrêt a été défini)

Le même code exécutera si ctrl + c est pressée , la seule différence est que vous devez mettre e.Cancel à true.

Comme tout le monde l'a souligné, le problème n'existe pas à l'exécution, cette solution de contournement est uniquement pour passer par le gestionnaire.

Questions connexes