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

时间:2012-03-02 14:50:23

标签: c# .net visual-studio command-line

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

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

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

1 个答案:

答案 0 :(得分:13)

简答:在CTRL-C

之后无效

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

还有cancelKeyPress-Event触发,您可以订阅并执行任何操作!

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

更新:Alois Kraus在收到CTRL-C后,写了一篇关于优雅地将控制台应用程序放下来的codeproject-Article

引用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,我们的终结者被称为。