2010-05-19 7 views
9

मैं सी # 4 में एक कंसोल ऐप लिख रहा हूं और अपने प्रोग्राम को गहराई से रद्द करना चाहता हूं और Ctrl + C दबाया जाता है। निम्नलिखित कोड मैंने कई बार पहले उपयोग किया है, लेकिन अब इसे .NET 4 में उपयोग करने का प्रयास करते समय, ऐसा लगता है कि एक अजीब अनचाहे अपवाद हो रहा है।मैं .NET 4 में Console.CancelKeyPress का उपयोग कैसे करूं? (.NET 3.5 और नीचे ठीक काम करता है)

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

अगर मैं .NET 3.5 के लक्ष्य फ्रेमवर्क बदलने के लिए, यह काम करता है।

संपादित करें: यह इस व्यक्ति समान समस्या दिखाई दे रहा है लगता है: http://johnwheatley.wordpress.com/2010/04/14/net-4-control-c-event-handler-broken/

+0

अपवाद क्या है? यह कहां होता है? आप वीएस (डीबग -> अपवाद या Ctrl + Alt + E) में अपवाद संवाद में विभिन्न अपवादों को तोड़ने में सक्षम कर सकते हैं। –

+0

यह एक सामान्य अपवाद नहीं है। मैंने जो लिंक जोड़ा है उस व्यक्ति ने इसे "प्रोग्राम गलती" के रूप में वर्णित किया है। लक्ष्य फ्रेमवर्क होने पर Ctrl + C दबाते समय मैं जो देखता हूं उसका एक स्क्रीनशॉट यहां होता है। वीईटी 2010 में .NET 4 चल रहा है: http://img227.imageshack.us/img227/5871/consoletest.jpg – BigJoe714

+0

बस एक अनुमान है, लेकिन आप शायद होस्टिंग प्रक्रिया को अक्षम करके इस समस्या को हल करने में सक्षम हों: अपनी प्रोजेक्ट पर राइट-क्लिक करें, गुण चुनें, डीबग टैब पर जाएं, और "विजुअल स्टूडियो होस्टिंग प्रक्रिया सक्षम करें" को अनचेक करें। –

उत्तर

12

यह Microsoft Connect पर एक ज्ञात समस्या है।

ध्यान दें कि यह डीबगर के बाहर काम करता है।

+0

जानकारी के लिए धन्यवाद! – BigJoe714

+0

क्या यह अब वीएस2012 में तय है? लिंक के अनुसार – Coops

+0

, यह है – mcmillab

2

VS2010 के तहत एक सांत्वना आवेदन और .NET 4.0 के लिए, मैं निम्नलिखित (बहुत साफ नहीं) वैकल्पिक हल का उपयोग कर रहा:

    परियोजना संपत्तियों में
  1. , के तहत [डिबग करें], जाँच [अप्रबंधित कोड डीबगिंग सक्षम];
  2. अपने कार्यक्रम वर्ग के स्टार्टअप कोड के दौरान, निम्नलिखित सम्मिलित (यह नेट 2 शैली है, अपने विवेक से lambdas का उपयोग करें):

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 
} 

हालांकि स्पष्ट नहीं, तो इस कोड आपको अपने CTRL-C हैंडलर को डीबग करने की अनुमति देगा:

  1. डीबगर (F5) के तहत अपना प्रोग्राम प्रारंभ करें;
  2. सुनिश्चित करें कि आपके प्रोग्राम के कंसोल पर ध्यान केंद्रित किया गया हो;
  3. प्रेस ctrl + रोकें (मेरे अक्षांश e6500 पर, मुझे ctrl और Fn और F12 पकड़ने की आवश्यकता है);

डिबगर, इस रुकावट के बारे में पूछेंगे क्लिक करें [पर ध्यान न दें] और आप हैंडलर में मिल जाएगा एक ही कोड निष्पादित करेंगे, तो CTRL + C दबाया जाता है (यकीन है कि एक ब्रेकपाइंट सेट किया गया था)

, केवल अंतर यह है कि आपको ई। कैंसल को सत्य पर सेट करना होगा।

जैसा कि सभी ने बताया है, समस्या रनटाइम पर मौजूद नहीं है, यह कामकाज केवल हैंडलर के माध्यम से कदम उठाने के लिए है।

संबंधित मुद्दे