我们有一个具有许多前台线程的 .NET 控制台应用程序。
如果我们使用任务管理器终止进程或从 Windows 命令行发出killjob、kill,是否有一种方法可以优雅地关闭应用程序(在 .net 控制台应用程序中添加托管代码),例如拥有一个函数被称为 TodoBeforeShutdown() 来处理对象、关闭任何打开的连接等。
附: - 我阅读了其他线程,他们都建议了不同的方法来终止进程,而不是我的具体问题,即在 .NET 托管代码中处理终止进程的最佳方法是什么。
提前致谢。
不幸的是,每当进程被终止时,都不会引发您可以处理的事件。
您可以想象终止一个进程,就像切断计算机电源一样——无论您设计在系统关闭时运行什么代码,如果计算机没有正常或正确关闭,该代码就不会运行。
当您使用任务管理器终止进程时,它会调用 Win32TerminateProcess函数,它无条件地强制进程(包括其拥有的所有线程)退出。的执行all线程/进程被停止,所有挂起的 I/O 请求被取消。你的程序实际上已经死了。The TerminateProcess
函数不会调用 CLR 提供的关闭序列,因此您的托管应用程序甚至不知道正在关闭。
您建议您在应用程序进程终止时关心处理对象,但这里有一些值得指出的事情:
始终努力将可能造成的损害降到最低。当您用完物品后,请尽早处理掉它们。不要等到以后。在任何给定时间,当程序的进程终止时,您应该只保留最少数量的对象,这将减少泄漏的可能性。
操作系统一般会清理并释放most终止时这些资源(即句柄等)的使用权。
最后,不用说,以这种方式终止进程确实是一种例外情况——即使某些资源泄漏,这是可以预料的。您不应该以这种方式关闭应用程序,就像您不应该终止必要的 Windows 系统进程一样(即使您可以在以管理员身份运行时这样做)。
如果这是您关闭控制台应用程序的常规计划,你需要寻找另一个计划.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)