C# 4.0 单线程Windows服务在桌面上延迟

C# 4.0 单线程Windows服务在桌面上延迟,c#-4.0,windows-services,single-threaded,C# 4.0,Windows Services,Single Threaded,我有一个Windows服务(C#4.0),它从私人消息队列中提取消息,并根据消息内容为每条消息发送一封或多封电子邮件(通常最多4封或5封) 消息量很低,因此我避免了复杂性,并让服务保持线程化,但电子邮件很重要,因此我需要确保在SCM Stop命令中,在停止完成之前处理/发送任何正在处理的消息/电子邮件 在OnStop中,我检查表示状态的静态“inProcess”标志,如果设置了该标志,我将调用ServiceBase.RequestAdditionalTime(120000) 有两个问题: Sto

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

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

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

有两个问题:

  • Stop命令立即完成,但有一些电子邮件未发送,尽管请求持续了2分钟
  • 即使成功了,我也只是在猜测我应该等多久
  • 在单线程服务中处理此问题的最佳方法是什么

    谢谢你的帮助


    Greg

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

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

    请参见此处的MSDN:

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

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


    至于您应该等待多长时间,这取决于电子邮件的重要性和队列中可能存在的电子邮件数量,以及它们是否在任何地方被持久化,以便重新启动服务将恢复到停止的位置。

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

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

    请参见此处的MSDN:

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

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


    至于您应该等待多长时间,这取决于电子邮件的重要性和队列中可能有多少电子邮件,以及它们是否在任何地方被保留,以便重新启动服务可以恢复到它们停止的位置。

    OK,根据下面的回答,循环回答非常简单-我没有强制完成最后一条消息,而是排队.EndPeek(),然后将当前消息放回队列,以便在开始时再次提取它。有时,显而易见的问题会让我们不知所措……好吧,根据下面的答案,这个循环答案非常简单——我没有强制完成最后一条消息,而是排队。EndPeek(),然后将当前消息放回队列,以便在启动时再次提取它。有时候,显而易见的事情会让我们逃避……感谢你澄清了RequestMoreTime()-我没有使用旧面条-当然这里只有一条线,所以RequestMoreTime()不可能做到我所想的。您关于持久化消息的评论确实起到了作用,但请参见上面的我的评论。谢谢@塞莱克斯:很高兴我能帮上忙!我们都被时不时出现的旧面条所困扰:-)谢谢你澄清RequestMoreTime()-我没有使用旧面条-当然这里只有一条线,所以RequestMoreTime()不可能做到我所想的。您关于持久化消息的评论确实起到了作用,但请参见上面的我的评论。谢谢@塞莱克斯:很高兴我能帮上忙!我们都被时不时出现的旧面条咬过:-)