我遇到了这个代码:
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