7

我猜所有执行都会立即停止,并且调用端会超时。当您停止服务时究竟会发生什么,您对它有多少控制权?

4

1 回答 1

6

当服务控制管理器告诉您的服务停止时,.Net ServiceBase 将状态设置为 SERVICE_STOP_PENDING 并调用您的服务的 OnStop 方法。您如何处理该通知取决于您。理想情况下,您将拥有一些机制,例如使用 CancellationToken 来通知您当前正在工作的任何线程,他们需要将其打包并尽快退出。在您的情况下,它可能涉及关闭您的 ServiceHost。您的 OnStop 方法应该等到它知道已经完成(例如,通过加入线程)才返回。有一些方法可以通知服务控制管理器您需要更多时间,或者只是让它知道您收到了通知并且您正在积极地停止工作(SERVICE_STATUS dwcheckpoint)。

如果您只是从 OnStop 立即返回(或不费心实现它),那么我认为您的服务线程将全部被强制终止。我不确定,因为我从未尝试过这个。我总是实施 OnStop,只有在一切都清理干净后才返回。如果您实现了 OnStop,但需要很长时间才能返回而没有让服务控制管理器知道您正在处理它,那么它将等待一段时间(服务停止 20 秒......这是一个注册表设置),然后终止你的线程。

正确的做法是编写您的服务,使其快速启动、快速停止、暂停和继续快速等等。正如您从上面的描述中看到的那样,您的情况究竟会发生什么,完全取决于您的服务是如何实现的。只有您拥有“确定”的信息。

http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx

于 2012-07-26T18:41:03.520 回答