C# 为什么我的.NET控制台应用程序在等待Ctrl-C时挂起

C# 为什么我的.NET控制台应用程序在等待Ctrl-C时挂起,c#,multithreading,console,C#,Multithreading,Console,我正在构建一个简单的控制台应用程序,它可以启动计时器并执行一些操作。如果用户按下Ctrl-C,我想关闭 当我编写此代码时,应用程序会检测到Ctrl-C,但随后会挂起并且从不关闭。我做错了什么 代码如下: using System; using System.Threading; namespace ConsoleApp1 { class Program { private static readonly AutoResetEvent _closeEvent =

我正在构建一个简单的控制台应用程序,它可以启动计时器并执行一些操作。如果用户按下Ctrl-C,我想关闭

当我编写此代码时,应用程序会检测到Ctrl-C,但随后会挂起并且从不关闭。我做错了什么

代码如下:

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        private static readonly AutoResetEvent _closeEvent = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World - waiting for Ctrl-C");

            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                Console.WriteLine("Got the Ctrl-C");
                _closeEvent.Set();
            };

            // Start up a timer and do work here...

            Console.WriteLine("Before WaitOne");
            _closeEvent.WaitOne();
            Console.WriteLine("After WaitOne");
        }
    }
}

我想知道这是否只是VisualStudio调试器的副作用?如果我在没有调试的情况下运行它,然后按Ctrl-C,控制台将显示“按任意键继续…”,然后按某个键终止应用程序。

看来,使此工作正常的关键是设置

eventArgs.Cancel = true;
CancelKeyPress
处理程序中


这一切都很好地工作,并且应用程序正确地终止。

这是我缺少的东西。有趣的是,在Rider中调试时,一切正常,但在另一个控制台中运行或在Visual Studio中调试时,它做了一些奇怪的事情:)