【问题标题】:Windows Service execute logic after OnStartWindows 服务在 OnStart 之后执行逻辑
【发布时间】:2015-07-21 02:44:49
【问题描述】:

我有一个 Windows 服务,其中有几个计时器作业。在 OnStart 方法中,我正在启动所有这些计时器。实际上,从服务控制台启动服务需要很长时间,而且大多数情况下,它会报告以下内容: Windows 无法在本地计算机上启动“servicename”服务。 服务没有及时响应启动或控制请求。

我知道我可以创建一个封装其他定时器的定时器,这样我就可以在 OnStart 事件之外启动它们。但是,我正在寻找其他可能的解决方案,因为我不喜欢有一个单独的计时器,除了启动其他进程之外什么都不做。

【问题讨论】:

  • 为什么启动计时器需要这么长时间?有数百个吗?你确定你是从 OnStart 回来的吗? (不这样做是该错误消息的常见原因。)
  • 不,少于 20 个。我们的自定义计时器类在启动时执行 Web 服务和数据库调用。
  • 我知道它正在从 OnStart 返回,因为我之前没有遇到错误。当我再添加 2 个计时器时,就出现了错误。

标签: windows service timer jobs


【解决方案1】:

在 OnStart 期间执行 Web 或数据库调用等外部操作通常并不安全,因为您无法预测它们需要多长时间,并且an excessively long service startup time can interfere with the system

服务控制管理器 (SCM) 会一直等待,直到服务报告 SERVICE_RUNNING 状态。建议服务尽快报告此状态,因为在此期间系统中需要与 SCM 交互的其他组件将被阻止。某些功能可能需要直接或间接与 SCM 交互。

所以正确的解决方案是将这个初始化移到一个单独的线程中。

但是,如果您不想这样做,可以致电RequestAdditionalTime

RequestAdditionalTime 方法旨在由重写的 OnContinue、OnPause、OnStart 或 OnStop 方法调用,以为挂起的操作请求额外的时间,以防止服务控制管理器 (SCM) 将服务标记为未响应。

【讨论】:

  • 嗯,这是对的,但它实际上并没有解释如何按照要求“在 OnStart 之后执行逻辑”。我需要澄清的是:一旦服务报告“SERVICE_RUNNING”状态,我可以运行一些代码吗?
  • @Flash,在您从 OnStart 返回之前,该服务不会报告 SERVICE_RUNNING。所以你必须启动一个单独的线程来完成服务的实际工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多