1

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

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

4

2 回答 2

0

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

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

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

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

于 2009-08-07T05:11:58.613 回答
0

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

如果它与数据库有关,则如果未提交,则可以回滚事务。

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

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

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

于 2009-07-15T02:35:43.143 回答