22

我需要在进程停止时执行一部分代码(状态保存) - 由自身、由用户、由任务管理器等。

是否可以?

try {} finally {}, AppDomain.ProcessExit, IDisposable, 析构函数,.. 下一步要尝试什么?

4

4 回答 4

18

正如其他人指出的那样,当应用程序KilledOperating Systemor存在时,您无法在应用程序中执行任何代码User。这就是为什么它被称为Killing.

如果保存状态是应用程序的重要组成部分,则应采用类似于数据库系统的方法。实现transaction log,创建checkpoints等。这是你能得到的最接近的。

在这种情况下,当您的应用程序恢复(在 be 之后重新运行killed)时,它可以检查这些transaction logs是否有任何待处理的更新或最后的状态更改。

除此之外,这真的取决于你想做什么。还有你为什么想出这个主意?我们能得到更多细节吗?可能有人在这里有更好的选择。

于 2010-12-18T19:45:32.227 回答
11

一个进程被不优雅地杀死的全部意义在于它只是停止了它正在做的事情。我真的找不到解决办法。

于 2010-12-18T19:57:12.773 回答
3

您需要考虑程序退出的原因。如果是因为错误,那么你可以使用 try/catch。在unix 术语中,进程管理器停止进程时发生的事情是终止(即发送SIGKILL 信号),它不允许程序在进程退出之前执行任何操作。许多病毒所做的是有两个进程(可能使用共享内存以避免持续的数据同步),每个进程都监视另一个进程的状态,当一个进程宕机时,另一个进程会重新启动它。也许第二个进程可以为您的案例以类似的方式监视和保存状态。不过,另一种信号是 SIGTERM。当您告诉计算机重新启动但有进程正在运行时,会发送此信号。内核允许程序自行尝试退出,但最终会询问用户是否可以终止程序。如果要处理 SIGTERM 查找处理信号。最终,我所知道的 SIGKILL 的唯一解决方案是两个进程的解决方案。

于 2010-12-18T19:39:21.940 回答
2

我环顾四周的原因与发布的内容有些不同,但我为自己想出了一个很好的解决方案,在这里说明可能很有用:

注意:对于那些知道它是什么的人来说,这本质上是“心跳”设计模式。

1)除了运行的代码会“死”(即被杀死)之外,向这个项目添加代码,使其在初始化时产生一个线程(或者可能是另一种方法?),并且所有线程都运行一个永不-结束 while 循环(但确保它在迭代之间至少休眠几秒钟甚至 1 分钟)并在 while 循环中记录一个指示符以指示您的应用程序处于“活动状态”(即“心跳”)。我个人建议在数据库或文件中设置一个值,即当前时间戳(即 DateTime.Now)

2) 现在您正在记录“心跳”,创建另一个应用程序(即另一个进程),它只读取心跳值(即当前时间戳)并在一个永无止境的 while 循环中执行此操作。一旦确定心跳值“坏”(例如,如果 HeartBeatTimestamp + 5 min < DateTime.Now),您现在可以运行您希望在“进程被终止后”运行的代码

希望这会有所帮助:) 如果您想了解更多信息,请随时从其他资源中研究“心跳”设计模式!

干杯,

杰夫

于 2018-10-04T20:00:01.130 回答