我有一个很好的老式Windows服务(继承自System.ServiceProcess.ServiceBase),我在this.components.Add(new MyStuff());
添加了一个组件(实现IComponent)。
但是,如果我从任务管理器关闭exe,MyStuff的Disposable()
就不会运行。
可能的嫌疑人:
出于测试目的,我使用
开始我的服务 var service = new MyService();
service.Run();
Thread.Wait(Timeout.Infinite);
而不是ServiceBase.Run(new []{new MyService()});
可能是问题吗?
请帮忙!
其他信息:我正在尝试使用Process.Start(...)关闭我从服务中启动的其他exes,所以如果有办法让它们自动关闭(子进程?)那么也好。
答案 0 :(得分:2)
为什么要使用任务管理器停止服务,你基本上是在杀死它,而不是让它做某事。
在OnStop方法中放入一些代码以清理并使用Service Manager来停止/启动服务。
答案 1 :(得分:2)
如果你“拔插头”,那时你什么也做不了。它不被视为受控关闭。这是完全出乎意料的,没有什么能让你有能力处理被杀死过程中的内容。它甚至不被认为是关闭。为了说清楚:你没有关闭,你正在杀掉它!它就像从计算机中拔出电源线并期望它正常关闭一样。不会工作(虽然我有一个测试人员几年前为我写了这个非常精确的测试用例......)
解决它:
您的子进程需要“ping”父进程。如果它没有响应,你知道出了问题并正常关机。
或者参考ChrisBint(服务控制器)的答案。按名称获取服务,启动和停止它。
在此处查找示例代码: http://www.csharp-examples.net/restart-windows-service/
答案 2 :(得分:2)
让孩子检测父母死亡的典型方式:
通过为互斥锁使用随机名称,即使在较旧的父/子层次结构正在关闭的过程中,也可以确保可以构建新的层次结构。