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

时间:2016-02-22 13:23:15

标签: c# .net asp.net-web-api windows-services owin

我正在编写一个可以自行托管OWIN WebApi Web服务的Windows服务。要启动Web服务,位置非常明显;在OnStart的{​​{1}}方法 - 扩展类:

ServiceBase

但是,我不确定在哪里处理网页应用。在this example project中,他们使用private IDisposable _webApiDataConnectionHost; protected override void OnStart(string[] args) { _webApiDataConnectionHost = WebApp.Start<OwinWebStartup>("..."); } 方法处理它:

OnStop

但是,如果这是protected override void OnStop() { if(_server != null) { _server.Dispose(); } base.OnStop(); } ,那么在服务的IDisposable方法覆盖中处置它是否正确?如下所示:

Dispose

哪个处理网络应用的适当位置?

2 个答案:

答案 0 :(得分:1)

我通常设置任何服务的方式是实现IDisposable接口并从OnStop调用Dispose方法。我的OnStop通常与我的OnPause相同,并附加调用Dispose。您可以看到msdn here的建议。

答案 1 :(得分:0)

  • 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的回答中也有链接。