【问题标题】:How do I use Console.CancelKeyPress in .NET 4? (Works fine in .NET 3.5 and below)如何在 .NET 4 中使用 Console.CancelKeyPress? (在 .NET 3.5 及更低版本中运行良好)
【发布时间】:2010-05-19 14:02:00
【问题描述】:

我正在用 C# 4 编写一个控制台应用程序,并且想要优雅地取消我的程序并按下 Ctrl + C。以下代码我以前用过很多次,但现在尝试在 .NET 4 中使用它时,似乎发生了一个奇怪的未处理异常。

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

如果我将 Target Framework 更改为 .NET 3.5,它可以工作。

编辑: 这个人似乎遇到了同样的问题: http://johnwheatley.wordpress.com/2010/04/14/net-4-control-c-event-handler-broken/

【问题讨论】:

  • 有什么异常?它发生在哪里?您可以在 VS 的“异常”对话框中启用对各种异常的中断(调试 -> 异常或 Ctrl+Alt+E)。
  • 这不是一个正常的例外。我添加的链接中的人将其描述为“程序错误”。下面是当目标框架是在 VS 2010 中运行的 .NET 4 时按 Ctrl+C 时看到的屏幕截图:img227.imageshack.us/img227/5871/consoletest.jpg
  • 只是一个猜测,但您可以通过禁用托管进程来解决此问题:右键单击您的项目,选择“属性”,转到“调试”选项卡,然后取消选中“启用 Visual Studio托管进程”。

标签: c# console .net-4.0


【解决方案1】:

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

请注意,它确实在调试器之外工作。

【讨论】:

  • 现在在 VS2012 中修复了吗?
  • 根据链接是
【解决方案2】:

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

  1. 在项目属性的[调试]下,勾选[启用非托管代码调试];
  2. 在 Program 类的启动代码期间,插入以下内容(这是 .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+pause(在我的纬度 e6500 上,我需要按住 ctrl 和 Fn 和 F12);

调试器会询问你这个中断,点击[Ignore]你会发现自己在处理程序中(确保设置了断点)

如果按下 ctrl+c 将执行相同的代码,唯一的区别是您必须将 e.Cancel 设置为 true。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多