如何在应用程序被任务管理器杀死时保存数据?

Posted

技术标签:

【中文标题】如何在应用程序被任务管理器杀死时保存数据?【英文标题】:How to save data at time an application gets killed via the Task Manager? 【发布时间】:2016-07-22 09:15:40 【问题描述】:

为了防止应用程序的数据因任务管理器的“结束任务”而丢失,我正在尝试将数据保存在 WM_CLOSE 事件的函数处理程序中。

如果我通过 Alt+F4 或“关闭”按钮关闭我的应用程序,应用程序会成功保存数据。但是当我通过任务管理器杀死它时,保存数据过程无法正确完成。保存进度好像中途终止了。

我尝试通过 VS2015 IDE 对其进行调试,调试器成功拦截了 WM_CLOSE 处理程序中的断点但无法继续,按 F10 跳过导致我的应用立即关闭。

有什么方法可以延迟终止进度,直到我的应用程序完全保存数据?

我在下面找到了两个链接,但它们没有帮助。

How to handle "End Task" from Windows Task Manager on a background process?

How does task manager kill my program?

【问题讨论】:

当您调试您的应用程序时,任务管理器认为它没有响应,并终止了它。您是否尝试过编写日志文件?您的保存过程需要多长时间? @Dutwo 通常需要不到 500ms。我尝试记录到一个文件,但有时它会记录,但并非总是如此。 如果我想在任务管理器中杀死你的应用程序,那我为什么要它保存任何东西?!我想要的只是立即终止的过程。对用户友好。 @Christian Hackl,对!我曾就此事与我的客户强烈争论过,但他们坚持要拥有这个“功能”。 【参考方案1】:

任务管理器可能会确定您的应用程序没有响应,并终止它。你对它无能为力。

如果您想确保始终保存您的数据,您应该在后台不断保存(使用一些启发式方法,例如至少每分钟一次,最好在几秒钟内没有发生任何变化之后)。它更复杂,但即使在您根本不会收到 WM_CLOSE 时也能正常工作,例如在断电的情况下。

【讨论】:

我确信当我的应用程序被任务管理器杀死时,WM_CLOSE 事件总是会被拦截。我上面提到的问题是终止发生得太快,以至于保存操作无法完成。我可以在一定时期内保存,但问题是数据经常变化,太多不必要的保存会影响性能。 是的,但是您不能对终止做任何事情,您不会收到有关终止的通知,也不能延迟终止。如果系统决定终止您的应用程序,它将立即终止它。

以上是关于如何在应用程序被任务管理器杀死时保存数据?的主要内容,如果未能解决你的问题,请参考以下文章

当应用被用户杀死时,工作管理器不工作。为啥?

如何防止任务管理器杀死我的 pythonw 脚本?

android (Service & PhoneStateListener) - 当应用程序被任务管理器、杀手或内存不足杀死时,服务确实重新启动但不工作

Android:如果任务管理器杀死,则重新调用应用程序

如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?

Delphi 7 - 防止用户在任务管理器中杀死进程