我有一个Windows服务(C#4.0),它从私人消息队列中选择消息,并且每个消息根据消息内容发送一个或多个电子邮件(通常最多4或5个)。
消息量很低所以我已经避免了复杂性并且使服务保持了sinlge-threaded,但是电子邮件很重要所以我需要确保在SCM停止命令上在停止之前处理/发送任何进程内消息/电子邮件完成。
在OnStop中,我正在寻找表示状态的静态“inProcess”标志,如果设置了,我正在调用ServiceBase.RequestAdditionalTime(120000)。
有两个问题:
在单线程服务中处理此问题的最佳方法是什么?
感谢您的帮助!
格雷格
答案 0 :(得分:0)
要完全回答,我们需要查看消息处理循环的结构。但我想的一件事是,如果停止命令(或暂停,继续,启动)花费太长时间,ServiceBase.RequestAdditionalTime()
方法用于阻止SCM抱怨,这并不意味着您的服务将等待两个停止前几分钟。
因此,它唯一真正做的就是让SCM在停止请求时不会出错,如果你有一个缓慢的停止过程。
请在此处查看MSDN:RequestAdditionalTime() method
我想知道的是,如果你在OnStop()
中调用并设置了一些完整的标志,处理循环会在看到这个标志时立即退出吗?
如果你可以发布你的代码,它会帮助我改进这个答案,但是从这个问题我想知道你是否期望这个调用等待2分钟让它处理更多,但是你正在设置一些东西告诉处理循环停止。如果不是这种情况,我可以进一步完善答案。
至于你应该等待多长时间,这取决于电子邮件的重要程度以及可能在队列中的数量,以及它们是否在任何地方持久存在以便重新启动服务会从中断的地方开始。< / p>