进程终止时的IDisposable代码

时间:2011-10-10 14:16:01

标签: c# .net process windows-services idisposable

我有一个很好的老式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()});可能是问题吗?

  • ServiceBase不会自动清理。如果是这样,我该怎么办?

请帮忙!

其他信息:我正在尝试使用Process.Start(...)关闭我从服务中启动的其他exes,所以如果有办法让它们自动关闭(子进程?)那么也好。

3 个答案:

答案 0 :(得分:2)

为什么要使用任务管理器停止服务,你基本上是在杀死它,而不是让它做某事。

在OnStop方法中放入一些代码以清理并使用Service Manager来停止/启动服务。

答案 1 :(得分:2)

如果你“拔插头”,那时你什么也做不了。它不被视为受控关闭。这是完全出乎意料的,没有什么能让你有能力处理被杀死过程中的内容。它甚至不被认为是关闭。为了说清楚:你没有关闭,你正在杀掉它!它就像从计算机中拔出电源线并期望它正常关闭一样。不会工作(虽然我有一个测试人员几年前为我写了这个非常精确的测试用例......)

解决它:

  • 您的子进程需要“ping”父进程。如果它没有响应,你知道出了问题并正常关机。

  • 或者参考ChrisBint(服务控制器)的答案。按名称获取服务,启动和停止它。

在此处查找示例代码: http://www.csharp-examples.net/restart-windows-service/

答案 2 :(得分:2)

让孩子检测父母死亡的典型方式:

  • 在父启动期间,生成一个漂亮,长,随机的名称
  • 同样在启动期间,获取具有此名称的命名互斥锁,并保持在父级的生命周期内保持锁定状态。
  • 启动子进程时,将长随机名称作为参数传递
  • 在子项中,专门设置一个尝试获取相同名称的互斥锁的线程。
  • 如果孩子获得互斥锁,则父进程必须已经死亡 - 所以孩子也应该退出

通过为互斥锁使用随机名称,即使在较旧的父/子层次结构正在关闭的过程中,也可以确保可以构建新的层次结构。