Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
管理.NET应用程序以在终止/终止时正常关闭_.net_Process_Kill_Handle - Fatal编程技术网

管理.NET应用程序以在终止/终止时正常关闭

管理.NET应用程序以在终止/终止时正常关闭,.net,process,kill,handle,.net,Process,Kill,Handle,我们有一个.NET控制台应用程序,它有许多前台线程。 如果我们使用任务管理器或发出killjob终止进程,请在windows中从命令行终止,是否有一种方法可以让我们优雅地关闭应用程序(在.net控制台应用程序中添加托管代码),比如让一个名为say todobeforeshutton()的函数来处理对象、关闭所有打开的连接,等等 另外,我阅读了其他线程,他们都提出了不同的终止进程的方法,而不是我的具体问题,即在.NET托管代码中处理终止进程的最佳方法是什么 提前感谢。不幸的是,每当进程被终止时,都

我们有一个.NET控制台应用程序,它有许多前台线程。 如果我们使用任务管理器或发出killjob终止进程,请在windows中从命令行终止,是否有一种方法可以让我们优雅地关闭应用程序(在.net控制台应用程序中添加托管代码),比如让一个名为say todobeforeshutton()的函数来处理对象、关闭所有打开的连接,等等

另外,我阅读了其他线程,他们都提出了不同的终止进程的方法,而不是我的具体问题,即在.NET托管代码中处理终止进程的最佳方法是什么


提前感谢。

不幸的是,每当进程被终止时,都不会引发任何事件供您处理。
您可以考虑终止进程,就像切断计算机电源一样,无论您设计在系统关闭时运行什么代码,如果计算机没有正常或正常关闭,该代码不会运行


当您使用任务管理器终止一个进程时,它会调用Win32函数,该函数无条件地强制该进程(包括其所有线程)退出。暂停所有线程/进程的执行,并取消所有挂起的I/O请求。你的程序实际上已经死了功能
TerminateProcess
不会调用CLR提供的关闭序列,因此您的托管应用程序甚至不知道正在关闭。

您建议在应用程序进程终止时处理对象,但这里有几点值得指出:

  • 始终努力将可能造成的损害降至最低。无论何时用完物品,都应尽早将其处理掉。不要等到以后。在任何给定的时间,当您的程序进程终止时,您应该只保留最少数量的对象,这将减少泄漏的可能性

  • 操作系统通常会在终止时清理并释放大部分资源(即句柄等)

  • 最后,不用说,即使某些资源泄漏,以这种方式终止进程确实是一种例外情况,这是意料之中的。您不应该以这种方式关闭应用程序,就像您不应该停止必要的Windows系统进程一样(即使您可以以管理员身份运行)


如果这是您关闭控制台应用程序的常规计划,您需要找到另一个计划

简而言之:您不能
终止进程与优雅退出完全相反。
如果您正在运行前台线程,发送wm_退出不会关闭您的应用程序。由于您有一个控制台应用程序,您可以简单地重定向控制台输入,将“退出”发送到您的进程。
此外,我认为您可以将应用程序更改为服务(而不是控制台应用程序),这将为您提供您想要的->基于windows内置工具/命令的gracefull退出界面。

感谢您的回复。我应该指出,这不是计划的一部分,而是我们公司批处理调度基础架构中的一个约束,它是从Linux的礼貌杀戮方式中产生的。这后来被移植到Windows上,他们最终使用了kill。@keepsmilinyar:有趣的是,“礼貌的kill”是相当不寻常的,即使在Unix世界中也是如此。大多数基于Unix的操作系统都会发送
SIGKILL
(无条件)而不是
SIGTERM
(礼貌的方式)来终止进程,以响应
killall
命令。“因此,您的托管应用程序甚至不知道正在关闭”-这很好,这显然意味着该应用程序完全不知道它正在被杀死。如果您想这样做,甚至不能记录关闭过程。