当我使用C C中断我的C#控制台应用程序时会发生什么?
进程被终止了吗?内存被释放了吗?是否执行finally
块?数据库连接会发生什么情况?
如果应用程序是为调试或发布而构建的,或者是在Visual Studio内部/外部运行的,这些有什么不同吗?
发布于 2012-03-02 22:59:12
简而言之:在按CTRL-C组合键后,它什么也不做
长答案:在MSDN上有一篇关于它的好文章,它清楚地指出,它发送一个信号(中断),而不是按键事件。
还有一个触发的cancelKeyPress-Event,你可以订阅它,做任何你想做的事情!
不幸的是,没有更多关于默认情况下实际做了什么的信息。也许在最坏的情况下,你可以自己去看看。但是我想应该有一些关于它的文档...
更新: Alois Kraus写了一篇关于在收到CTRL-C后优雅地关闭控制台应用程序的codeproject-Article。
引用Alois Kraus的话:
CLR的默认行为是不执行任何操作。这确实意味着,由于OS加载器锁定已被占用,因此CLR会收到DLL_PROCESS_DETACH通知,在该通知中,任何托管代码都不能再运行。不幸的是,我们没有收到任何通知事件,也没有运行任何终结器。所有线程都被无声地杀死,没有机会执行它们的catch/finally块来进行有序的关闭。我在第一句话中说的是默认,因为有一种方法可以优雅地处理这种情况。Console类在.NET 2.0中有一个新的事件成员: Console.CancelKeyPress。它允许您获得Ctrl-C和Ctrl-Break键的通知,您可以在其中停止关机(仅适用于Ctrl-C,而不适用于Ctrl-Break)。这里的主要问题是,如果您捕获Ctrl-C/Break事件并退出处理程序,则不会调用终结器。这不是我所说的合作关闭。我想到的第一件事就是调用Environment.Exit,但它不会触发任何终结器。并不是一切都失败了。我确实想出了一个肮脏的技巧来运行所有的终结器:我们在事件处理程序中旋转一个小帮助器线程,然后它将调用Environment.Exit。瞧,我们的终结器叫做.
https://stackoverflow.com/questions/9535232
复制相似问题