进程终止时的可丢弃代码

本文关键字:代码 终止 进程 | 更新日期: 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来停止/启动服务。