使用Control-C中断C#控制台应用程序时会发生什么?

使用Control-C中断C#控制台应用程序时会发生什么?

这个过程被杀了吗? 内存是否被释放? finally块执行了吗? 数据库连接会发生什么?

如果应用程序是为调试或发布而构建的,或者在Visual Studio内部/外部运行,那么这些是否有所不同?

简答:在CTRL-C之后它什么也没做

长答案:在MSDN上有一篇很好的文章明确指出,它发送一个信号(中断)而不是按键事件。

还有一个cancelKeyPress-Event触发,你可以订阅并做任何你想做的事情!

不幸的是,没有更多的信息,默认情况下实际完成了什么。 也许在最糟糕的情况下,你可以自己检查一下。 但是imo应该有一些关于它的文档……

更新: Alois Kraus写了一篇关于在收到CTRL-C后优雅地将控制台应用程序排除在外的代码项目文章 。

引用Alois Kraus:

CLR的默认行为是什么都不做。 这确实意味着CLR很快就会被DLL_PROCESS_DETACH通知通知,在该通知中,由于已经采用了OS加载程序锁定,因此不再运行托管代码。 我们处于不幸的情况,我们没有收到任何通知事件,也没有任何终结者。 所有线程都被静默杀死,没有机会执行catch / finally块来进行有序关闭。 我在第一句中默认说,因为有一种方法可以优雅地处理这种情况。 Console类有一个带有.NET 2.0的新事件成员:Console.CancelKeyPress。 它允许您获得Ctrl-C和Ctrl-Break键的通知,您可以在其中停止关闭(仅适用于Ctrl-C,但不适用于Ctrl-Break)。 这里的主要问题是如果你捕获Ctrl-C / Break事件并退出处理程序,则没有调用终结器。 这不是我所谓的合作关闭。 我想到的第一件事是调用Environment.Exit,但它不会触发任何终结器。 一切都没有丢失。 我确实提出了一个肮脏的技巧来运行所有终结器:我们在事件处理程序中启动一个小辅助线程,然后调用Environment.Exit。 Voila,我们的终结者被称为。