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

Col*_*nic 19 .net c# command-line visual-studio

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

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

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

bas*_*sti 13

简答:在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,我们的终结者被称为.