Windows服务实现IDisposable – 这是不好的做法吗?

我遇到了这个代码:

public class ServiceLauncher2 : ServiceBase, IDisposable 

然后这个:

  /// <summary> /// Disposes the controllers /// </summary> // This is declared new as opposed to override because the base class has to be able to // call its own Dispose(bool) method and not this one. We could just as easily name // this method something different, but keeping it Dispose is just as valid. public new void Dispose() { foreach (var mgr in _threadManagers) mgr.Dispose(); base.Dispose(); } 

我以前从来没有在Windows服务实现中看到过这个。 通常只是OnStop / OnStart被覆盖。 这是不好的做法?

让我们来看看这是不好的做法:

  • 新的关键字是光栅,它告诉编译器关闭代码中的潜在问题。 一个真正的,使用这个类的代码可以很容易地结束调用ServiceBase.Dispose()。 ServiceBase实现一次性模式,正确的方法是重写受保护的Dispose(bool)方法

  • Dispose()方法留下了一个_threadManagers集合对象,其中只包含死对象。 这使得收藏品也像门卫一样死亡,之后迭代是毫无意义的。 应该已经清空了

  • 这个Dispose()方法可以被调用的唯一时间就是服务终止。 不能在OnStop()中做,它也处置了ServiceBase。 在终结器运行和处理终止之前,将“控制器”放置一微秒是没有意义的。 Dispose()只能用于允许非托管资源提前解除分配。 这个过程在一毫秒之后就停止了

这段代码没有意义。 不要使用它。

它看起来不标准,但它是合法的 。 所以我不一定称之为不好的做法,虽然它引起了混乱的事实使得它不好的做法?

这是否只作为服务运行或有控制台模式? (控制台应用程序不会得到OnStop调用。)或者是否有其他(自定义)的方式来停止此服务过程?

从我自己以前的问题来揣摩:

我不知道为什么new而不是override ,特别是因为base.Dispose()被调用。

原因:

'SomeClass.Dispose()':不能重载继承的成员'System.ComponentModel.Component.Dispose()',因为它没有被标记为虚拟的,抽象的或覆盖

换句话说,ServiceBase.Dispose的实现是不可覆盖的。

为了增加Hans和Paul的完美答案:将ServiceLauncher2声明为IDisposable是多余的,因为ServiceBase是一个Component ,而这个Component已经是IDisposable