2

我有一个 Windows 服务(C# 4.0),它从私人消息队列中挑选消息,并根据消息内容为每条消息发送一封或多封电子邮件(通常最多 4 或 5 封)。

消息量很低,因此我避免了复杂性并让服务保持单线程,但电子邮件很重要,因此我需要确保在 SCM 停止命令上,任何进程中的消息/电子邮件在停止完成之前处理/发送。

在 OnStop 中,我正在检查一个表示状态的静态“inProcess”标志,如果已设置,我将调用 ServiceBase.RequestAdditionalTime(120000)。

有2个问题:

  1. 尽管请求了 2 分钟,但停止命令会立即完成,但有一些电子邮件未发送。
  2. 即使它有效,我也只是猜测我应该等待多长时间。

在单线程服务中处理此问题的最佳方法是什么?

谢谢你的帮助!

格雷格

4

1 回答 1

0

要完全回答,我们需要查看消息处理循环的结构。但我在想的一件事是,ServiceBase.RequestAdditionalTime()如果停止命令(或暂停、继续、启动)时间过长,该方法用于防止 SCM 抱怨,这并不意味着您的服务将在停止前等待两分钟。

因此,它真正做的唯一一件事就是防止 SCM 在停止请求时出错,如果您有一个缓慢的停止过程。

请参阅此处的 MSDN:RequestAdditionalTime() 方法

我想知道的是,如果您被调用OnStop()并设置了一些完整的标志,并且处理循环在看到此标志时立即退出?

如果您可以发布您的代码,它将帮助我完善这个答案,但是从问题中我想知道您是否期望调用等待 2 分钟以让它处理更多,但是您正在设置一些东西来告诉处理循环停止。如果不是这种情况,我可以进一步完善答案。

至于您应该等待多长时间,这取决于电子邮件的重要性以及队列中可能有多少电子邮件,以及它们是否保留在任何地方,以便重新启动服务会从中断的地方继续。

于 2011-11-16T22:07:35.000 回答