我需要在进程停止时执行一部分代码(状态保存) - 由用户,任务管理器等执行。
有可能吗?
try {} finally {}
,AppDomain.ProcessExit
,IDisposable
,析构函数,...接下来要尝试什么?
答案 0 :(得分:16)
正如其他人所指出的,当Killed
Operating System
或User
为Killing
时,您无法在应用程序中执行任何代码。这就是为什么它叫transaction log
。
如果保存状态是应用程序的重要部分,则应采用类似于数据库系统的方法。实施checkpoints
,创建killed
等等。这是您可以获得的最接近的。
在这种情况下,当您的应用程序恢复时(在transaction logs
后重新运行),它可以检查这些{{1}}是否有任何挂起的更新或上次状态更改。
除此之外,它实际上取决于你想做什么。还有为什么你提出这个想法?我们可以获得更多细节吗?可能是这里有人有更好的选择。
答案 1 :(得分:10)
一个过程被杀死的过程的全部意义在于它只是停止它正在做的事情。我真的看不到那种方法。
答案 2 :(得分:2)
您需要考虑您的计划退出的原因。如果是因为错误,那么你可以使用try / catch。在unix术语中,当进程管理器暂停进程时发生的事情是kill(即发送SIGKILL信号),该进程不允许程序在退出进程之前执行任何操作。许多病毒做的是有两个进程(可能有共享内存以避免持续的数据同步),每个进程都监视另一个进程的状态,当一个进程发生故障时,另一个进程重新生成它。也许第二个过程可以以类似的方式监视和保存状态。另一种信号是SIGTERM。当您告诉计算机重新启动但有进程正在运行时,会发送此信号。内核允许程序自己尝试退出,但最终会询问用户是否可以终止该程序。如果要处理SIGTERM查找处理信号。最终,我知道SIGKILL的唯一解决方案是两个流程解决方案。
答案 3 :(得分:1)
我环顾四周的原因与所发布的内容有所不同,但是我为自己想出了一个很好的解决方案,在这里陈述可能会有用:
注意:对于那些知道它是什么的人,这实质上是“心跳”设计模式。
1)除了运行的代码将“死亡”(即被杀死)外,还向该项目添加代码,使其在初始化时产生线程(或可能的其他方法?),并且所有线程都在运行一个永无止境的while循环(但请确保在两次迭代之间至少休眠几秒钟或什至1分钟),并在while循环中记录一个指示符,以指示您的应用程序处于“有效状态”(即“心跳”)。我个人建议在数据库或文件中设置一个值,即当前时间戳(即DateTime.Now)
2)现在,您正在记录“心跳”,请创建另一个只读取心跳值(即当前时间戳记)的应用程序(即另一个进程),并在永无休止的while循环中执行此操作。一旦确定心跳值是“坏的”(例如,如果HeartBeatTimestamp + 5 min 希望这对您有帮助:)可以从其他资源中随意研究“心跳”设计模式,以了解更多信息! 干杯 杰夫