【问题标题】:How to Stop a Windows Service for long running Jobs?如何为长时间运行的作业停止 Windows 服务?
【发布时间】:2013-04-22 02:44:08
【问题描述】:

目前我正在使用 Windows 服务继续在后台运行一些作业。这些作业是通过 Quartz.Net 安排的。通常这些是长时间运行的作业,从 5 分钟到 15 分钟不等。如果作业当前正在运行,并且用户将尝试关闭 Windows 服务,则会抛出异常:Windows 服务未及时响应。

实际上是 WindowsService 的 OnShutdown() 方法,我也在尝试关闭 Quartz.Net。 我正在调用 scheduler.Shutdown(true) 来停止调度程序并等待正在运行的作业。如果我将其设为 False,则 Windows 服务将正常停止,但它会将正在运行的作业置于不稳定状态。请帮我解决这个问题。

【问题讨论】:

  • 您收到错误消息“Windows 服务没有及时响应”,因为您的主线程正在处理您在其上安排的作业。如果用户关闭服务,框架期望它响应关闭命令。如果您在单独的线程上执行作业,那么您将能够取消对作业的处理,并及时响应“关闭”命令。这会是一个选择吗?
  • 是的,这可能是一个选择。它会正常停止服务,但是正在运行的作业会发生什么?如果作业将保持在运行状态,那么如果用户将尝试重新启动 Windows 服务,那么情况会是什么?
  • 好吧,我以前从未使用过 Quartz,但它有自己的 API 来控制计划作业。如果您选择取消方法,是否可以对行为进行编程以如何处理正在运行的作业?

标签: c# quartz-scheduler


【解决方案1】:

您收到此错误是因为您的服务未在约定的时间内完成停止。因此,SCM 假定它以某种方式挂起并中止它。

要告诉 SCM 您需要更多时间来完成操作,请在您的 OnStop 处理程序中调用 ServiceBase.RequestAdditionalTime()。欲了解更多信息,请参阅http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多