进程终止时的可丢弃代码
本文关键字:代码 终止 进程 | 更新日期: 2023-09-27 18:10:55
我有一个很好的老式windows服务(继承自System.ServiceProcess.ServiceBase),我通过this.components.Add(new MyStuff());
添加了一个组件(实现iccomponent)
然而,如果我从任务管理器中关闭exe, MyStuff的Disposable()
不会运行。
可能的嫌疑人:
- "结束进程"上没有任何运行。如果是这样,我如何清理自己(例如杀死已启动的进程?)
-
为了测试目的,我用
启动我的服务var service = new MyService();
service.Run();
Thread.Wait(Timeout.Infinite);代替
ServiceBase.Run(new []{new MyService()});
会是问题吗? ServiceBase不会自动清理。如果有,我该怎么办?
请帮忙!
附加信息:我试图关闭其他前任我已经开始使用process . start(…)从我的服务,所以如果有一种方法,使他们自动关闭(子进程?),那将是很好的。
我让孩子发现父母去世的典型方式:
- 在父启动时,生成一个漂亮的,长,随机的名称
- 同样在启动期间,获取一个命名互斥锁,并在父进程的生命周期内保持锁定。
- 当启动子进程时,将长随机名称作为参数传递
- 在子线程中,指定一个尝试获取同名互斥锁的线程。
- 如果子进程获得了互斥锁,那么父进程一定已经死亡——所以子进程也应该退出
通过为互斥锁使用一个随机的名字,你可以确保一个新的层次结构可以被构建,即使旧的父/子层次结构在被关闭的过程中。
如果你"拔掉插头",那一刻你就无能为力了。它不被认为是一个可控的关闭。这是完全出乎意料的,没有任何东西会给你从被杀死的进程内部处理它的能力。这甚至不算是政府关门。说清楚一点:你不是在关闭,你是在扼杀它!这就像把电源线从你的电脑上扯下来,期望它能优雅地关机。不能工作(尽管几年前我有一个测试人员为我写了这个非常精确的测试用例…)
解决方法:
-
子进程需要"ping"父进程。
-
或参考ChrisBint (Service Controller)的回答。通过名称获取服务,启动和停止它。
在这里找到一个示例代码:http://www.csharp-examples.net/restart-windows-service/
为什么使用任务管理器停止服务,你基本上是杀死它,而不是要求它做什么。
在OnStop方法中加入一些代码来清理,并使用Service Manager来停止/启动服务。