2010-05-19 48 views
9

我正在C#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

什么是例外?它发生在哪里?您可以在VS中的“例外”对话框中调试各种异常(调试 - >例外或Ctrl + Alt + E)。 – 2010-05-19 14:03:54

+0

它不是一个正常的例外。我添加的链接中的人员将其描述为“程序错误”。以下是我在VS 2010中运行.NET 4时按Ctrl + C时所看到的屏幕截图:http://img227.imageshack.us/img227/5871/consoletest.jpg – BigJoe714 2010-05-19 14:07:47

+0

只是猜测,但你可能会通过禁用托管进程可以解决此问题:右键单击项目,选择属性,转到调试选项卡,然后取消选中“启用Visual Studio托管过程”。 – 2010-05-19 14:10:37

回答

12

这是Microsoft Connect一个已知的问题。

请注意,它在调试器外部工作。

+0

感谢您的信息! – BigJoe714 2010-05-19 14:17:25

+0

现在在VS2012中修复了吗? – Coops 2013-08-08 15:34:48

+0

根据链接,它是 – mcmillab 2013-12-09 21:47:11

2

对于下VS2010控制台应用程序和.NET 4.0,我使用以下的(不是很干净)的解决方法:

    在项目属性
  1. ,下[调试],检查[启用非托管代码调试];
  2. 程序类的启动代码中,插入以下(这是.NET 2的风格,由您决定使用lambda表达式):

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 ,唯一的区别是你必须将e.Cancel设置为true。

正如其他人指出的那样,问题不存在于运行时,此解决方法仅用于逐步处理处理程序。

相关问题