我设法将其简化为使用.Net Framework 4.6在VS2017中运行的最小测试用例:
static void Main(string[] args)
{
Console.CancelKeyPress += (o, e) => End(); //some attempt to exit gracefully
Task.Run(() => Task.Delay(100000)).Wait();
}
private static void End()
{
Console.WriteLine("EXITING...");
}
如果在调试器中以Console.CancelKeyPress
注释掉运行此命令,则CTRL + C会强制终止应用程序。使用编写的代码,即使我的事件处理程序没有采取任何措施来防止终止,它也会输出“ EXITING ...”,然后挂起。
如果我从命令行运行,则两个版本均按预期退出。
[花了我一些时间来找出未完成的Task
,但是我不知道为什么事件处理程序正在改变行为。谁能找出原因?这是一些调试器怪癖吗?我在调试器中没有看到错误...
这只是一个疯狂的猜测,但是您是否检查了将ConsoleCancelEventArgs实例e的Cancel属性设置为false会发生什么情况?
如果这能解决您的问题,那将很奇怪,不过,这可能有助于缩小问题的范围。
PS:由于我目前在Linux机器上,所以我自己无法对其进行测试。