在 Window 服务中处理 WebApp.Start 实例的正确位置?
Correct place to dispose of WebApp.Start instance in a Window service?
我正在编写一个 Windows 服务,它将自行托管 OWIN WebApi Web 服务。要启动 Web 服务,位置非常明显;在 ServiceBase
的 OnStart
方法中 - 扩展 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 的回答中。
我正在编写一个 Windows 服务,它将自行托管 OWIN WebApi Web 服务。要启动 Web 服务,位置非常明显;在 ServiceBase
的 OnStart
方法中 - 扩展 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 的回答中。