当我使用 Control-C 中断 C# 控制台应用程序时会发生什么?
进程被杀死了吗?内存被释放了吗?是finally
块被执行?数据库连接会发生什么情况?
如果应用程序是为调试或发布而构建的,或者在 Visual Studio 内部/外部运行,那么这是否有所不同?
简短回答:CTRL-C 之后什么都不做
长答案:网上有一篇关于它的好文章MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ms682541%28v=vs.85%29.aspx它明确指出,它发送信号(中断)而不是按键事件。
还有一个取消按键事件 http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress.aspx触发后您可以订阅并做任何您想做的事情!
不幸的是,没有更多关于默认情况下实际执行的操作的信息。也许最坏的情况你可以自己检查一下。但我认为应该有一些关于它的文档......
UPDATE:阿洛伊斯·克劳斯写了一篇codeproject-文章 http://www.codeproject.com/Articles/16164/Managed-Application-Shutdown关于在收到 CTRL-C 后优雅地关闭控制台应用程序。
引用阿洛伊斯·克劳斯的话:
CLR 的默认行为是不执行任何操作。这确实意味着 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。瞧,我们的终结器被调用了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)