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

21

当我使用 Control-C 终止我的 C# 控制台应用程序时会发生什么?

进程是否被终止?内存是否被释放?finally 块是否执行?数据库连接会发生什么?

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

1个回答

14

简短回答:按下CTRL-C后它什么也不做。

详细回答:关于这个问题,在MSDN上有一篇很好的文章,清楚地说明它发送了一个信号(中断),而不是键盘事件。

同时,也会触发cancelKeyPress-Event事件,你可以订阅并执行想要的操作!

不幸的是,没有更多关于默认情况下实际执行的信息。也许在最坏的情况下,你可以自己检查一下。但我认为应该有一些文档来说明这个问题...

更新:Alois Kraus写了一篇codeproject-Article文章,介绍如何优雅地关闭控制台应用程序以响应CTRL-C。

引用Alois Kraus的话:

CLR的默认行为是什么都不做。这意味着在DLL_PROCESS_DETACH通知中,CLR会被非常晚地通知,在此上下文中,由于操作系统加载器锁已经被占用,因此不能再运行任何托管代码。我们处于不幸的境地,既没有收到通知事件,也没有运行任何终结器。所有线程都会被静默地杀死,没有机会执行它们的catch/finally块以进行有序关闭。我在第一句话中说了默认值,因为有一种优雅地处理这种情况的方法。Console类在.NET 2.0中增加了一个新的事件成员:Console.CancelKeyPress。它允许您在按下Ctrl-C和Ctrl-Break键时得到通知,您可以停止关闭(仅适用于Ctrl-C,但不适用于Ctrl-Break)。这里的主要问题是,如果您捕获了Ctrl-C/Break事件并退出处理程序,则不会调用任何终结器。这不是我所谓的合作式关闭。我想到的第一件事是调用Environment.Exit,但它不会触发任何终结器。还没有输掉。我想出了一个肮脏的技巧来运行所有终结器:我们在事件处理程序内部启动一个小助手线程,然后调用Environment.Exit。哇,我们的终结器被调用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接