【问题标题】:Shutting down a Long-running process in a Windows Service关闭 Windows 服务中的长时间运行的进程
【发布时间】:2009-07-15 01:57:51
【问题描述】:

我有一个执行长时间运行进程的 Windows 服务。它由计时器触发,整个过程可能需要几分钟才能完成。当计时器结束时,服务会实例化一个管理对象,该对象执行各种任务、记录结果然后退出。

当服务器在进程中间关闭时,我没有实现任何处理这些情况的方法。这可能会导致一些问题。处理此问题的最佳做法是什么?

【问题讨论】:

    标签: c# windows service long-running-processes


    【解决方案1】:

    只能给出模糊的建议,因为我不知道你实际在做什么。

    如果是用数据库做的事情,如果没有提交,就有可以回滚的事务。

    如果涉及到一些文件操作,或许可以看看this 关于事务性 NTFS 的文章。您可以将它与 TransactionScope 对象结合使用以确保原子事务。

    如果您正在处理 Web 服务,那么服务边界将决定一个事务何时开始/结束以及另一个事务何时开始,请使用补偿模型(如果您破坏了某些内容,则需要稍后提供一种方式,恢复后,在另一端通知/执行补偿脚本的方法。(考虑在线订购书以及如何处理延期交货、取消等)

    对于跟踪机制,如果发生诸如关机之类的情况,请记录每个步骤和故障排除时间表。

    【讨论】:

      【解决方案2】:

      如果您本质上描述的是一个批处理过程,那么可以有一个定时工作的计时器 - 世界上大部分地区都是这样工作的。

      如果它长时间运行,请尽量保持您的工作单元或批次足够小,以便您的进程至少可以检查它是否已发出停止信号。这将允许服务正常退出,而不是基本上忽略服务停止消息。

      在你的定时器函数的某个地方,你有一个属性,IsShutdownRequired 或类似的,你检查(假设一些循环处理)。此属性在服务停止控制消息中设置为 true,这允许您的进程通过不尝试做更多工作或如 Jimmy 建议的那样在事务中回滚该工作来优雅地退出。

      理想情况下,小批量会比大批量好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 2011-01-22
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        相关资源
        最近更新 更多