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



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

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

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

简短回答:它在CTRL-C 之后什么都不做

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

还有一个cancelKeyPress事件触发,你可以订阅并做任何你想做的事!

不幸的是,没有更多关于默认情况下实际操作的信息。也许在最坏的情况下,你可以自己去看看。但是imo应该有一些关于它的文档…

更新:Alois Kraus写了一篇关于在收到CTRL-C后优雅地关闭控制台应用程序的代码项目文章。

引用阿洛伊斯·克劳斯的话:

CLR的默认行为是不执行任何操作。这意味着CLR很晚才会收到DLL_PROCESS_DETACH通知,在该通知中,由于操作系统加载程序锁定已被占用,托管代码无法再运行。不幸的是,我们没有收到任何通知事件,也没有运行任何终结器。所有线程都被静默地杀死,没有机会执行它们的catch/finaly块来进行有序的关闭。我在第一句话中说默认,因为有一种方法可以优雅地处理这种情况。Console类在.NET 2.0中获得了一个新的事件成员:Console.CancelKeyPress。它允许您获得Ctrl-C和Ctrl-Break键的通知,在这些键中您可以停止关闭(仅适用于Ctrl-C,但不适用于CtrlBreak)。这里的主要问题是,如果捕获Ctrl-C/Break事件并退出处理程序,则不会调用终结器。这不是我所说的合作关闭。我首先想到的是调用Environment.Exit,但它不会触发任何终结器。没有失去一切。我确实想出了一个运行所有终结器的肮脏技巧:我们在事件处理程序中启动一个小助手线程,然后它将调用Environment.Exit。瞧,我们的终结器被调用了。

最新更新