在 Window 服务中处理 WebApp.Start 实例的正确位置?

Correct place to dispose of WebApp.Start instance in a Window service?

我正在编写一个 Windows 服务,它将自行托管 OWIN WebApi Web 服务。要启动 Web 服务,位置非常明显;在 ServiceBaseOnStart 方法中 - 扩展 class:

private IDisposable _webApiDataConnectionHost;

protected override void OnStart(string[] args) {
    _webApiDataConnectionHost = WebApp.Start<OwinWebStartup>("...");
}

但是,我不确定在哪里处理网络应用程序。在 this example project 中,他们在 OnStop 方法中处理它:

protected override void OnStop()
{
    if(_server != null)
    {
        _server.Dispose();
    }
    base.OnStop();
}

但是鉴于这是一个 IDisposable,在服务覆盖 Dispose 方法时处理它是否正确?类似于以下内容:

protected override void Dispose(bool disposing) {
    if (disposing) {
        if (components != null) { components.Dispose(); }

        // Dispose of our web app if it exists...
        if (_webApiDataConnectionHost != null) {
            _webApiDataConnectionHost.Dispose();
        }
    }

    base.Dispose(disposing);
}

哪个地方是处理网络应用程序的合适位置?

我通常设置任何服务的方式是实现 IDisposable 接口并从 OnStop 调用 Dispose 方法。我的 OnStop 通常与我的 OnPause 相同,只是额外调用了 Dispose。可以从msdn看到推荐here.

  • 成为 IDisposable 可以保证垃圾回收,迟早会
    • 如果您不调用 Dispose(),收集可能会在以后 发生不确定性。
  • 由于它是一项服务,您知道何时希望服务停止,因此您可以自己致电Dispose(),在OnStop().
  • 此外,您将 运行 只有它的一个实例 - 因此请使用 Singleton 设计模式。如果多个线程将访问单例实例,请实施线程安全模式。

如果我没弄错的话,您在服务覆盖 Dispose() 中编写的代码只是确保实例将被垃圾回收时,all 资源将被释放。使用该方法,您可以确保无论何时发生处置都会正确发生。您仍然需要在 OnStop().

中调用此覆盖方法

* Do I need to dispose a web service reference in ASP.NET?

* Remarks on Disposing ServiceBase - 也链接在 Kent Cooper 的回答中。