首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当我使用C C中断C#控制台应用程序时会发生什么?

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

Stack Overflow用户
提问于 2012-03-02 22:50:23
回答 1查看 3.9K关注 0票数 21

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。瞧,我们的终结器叫做.

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9535232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档