当进程被任务管理器等进程终止时,如何释放资源?有没有办法在进程关闭之前调用函数?

有帮助吗?

解决方案

有真正是什么,如果你的进程被杀死,你可以做。根据定义,查杀的过程就是这样 - 杀死它。该过程没有得到运行任何代码的机会。这是非常“设计”。

想象一下,你可以(或另一个进程)注册一个当你的过程是由用户杀了那个被称为程序。那会是什么?在你的进程中所有其他线程将处于不确定状态,你将如何与他们同步?请记住,这个想法是,该进程需要被杀害。

在另一种情况是更加强硬:你的代码是良性的,并试图做正确的事情 - 例如清理是一个很好的系统公民。某些代码是没有的。试想一个福音恶意软件作者会是什么,如果因为这是被杀害的过程中运行的操作系统允许代码。这将是够糟糕对于用标准用户权限具有管理权限的所有正在运行的运行,并且完全可怕的恶意进程。

关键定型和结构化异常处理将不解决这个根本问题。

在上行方面,该操作系统将释放所有它知道当你的进程被终止,即内存和内核对象的资源。那些不会泄漏。但是Explorer不知道你的过程,因此它不能清理它。

要解决这个问题将有一个监测过程,让您的其他进程状态的跟踪,并为它清理的方法之一。你可以用一个简单的过程做到这一点,或使用服务。你也可以考虑某种形式的外壳扩展的且拥有自己的线程做同样的事情。

其他提示

有没有办法一种方法,其将要由一个呼叫被杀死到TerminateProcess,诸如通过任务管理器,或诸如TSKILL或TASKKILL另一工艺实用程序内终止时执行任意代码

这实现IDisposable

无论临界终结,也不终结普通,也不尝试/最后的块,而且肯定不是单纯的对象可以使代码在这种情况下被执行。甚至将DLL分离事件将不会被从经由TerminateProcess过程终止调用。

你能做的最好是使用监视进程,监视你原来的流程和执行时,原来的进程被终止相关代码。

理论上,操作系统应该在进程被终止后释放资源。您特别想到什么样的资源?


编辑:

好吧,解释起来有点棘手。我正在使用一个包装一些操作系统函数来管理一些 Shell 扩展的库。当应用程序关闭而没有显式调用适当的方法时,所有资源管理器都会冻结,我需要重新启动它。

任何非托管 DLL(根据文档)都应该使用 DLL_PROCESS_DETACH 事件;然而,这 DLL_PROCESS_DETACH 当进程通过以下方式终止时,不会调用事件 TerminateProcess API。

谷歌搜索 这些条款 出现 老新事物:为什么不能捕获 TerminateProcess?其中说:“一旦使用 TerminateProcess 终止,该进程中将不再运行用户模式代码。它消失了。"

因为您尝试使用的所有内容(即.NET、Explorer、Shell、COM)发生在用户模式下,我认为答案是没有办法做你想做的事。

相反,也许还有另一种方法:例如,通过向 Shell 扩展添加代码,以便它们意识到您的进程是否异常终止。

您可以尝试包装你的整个过程在一个try / finally语句(你把finally从句中释放的东西),但在某些情况下甚至会是不够的。

其实,我想你可以从你的进程启动一个后台线程与主线程做的所有的东西,的Thread.join(),因此,如果出现错误的子线程,主线程将仍然能够正确的事情。当然,如果整个过程被终止某种原因,这是行不通的。

您也可以启动一个子进程,并呼吁Process.WaitForExit(),但我不知道,如果你的shell有关的事情可能与多进程的方式工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top