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

Cra*_*rer 2 c# console multithreading

我正在构建一个简单的控制台应用程序,它启动一个计时器并执行一些操作。如果用户按下 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*rer 6

似乎使这项工作的关键是设置

eventArgs.Cancel = true;
Run Code Online (Sandbox Code Playgroud)

CancelKeyPress处理程序内部。

然后一切正常,应用程序正确终止。