我有一个从ServiceBase
派生的Windows服务类,它使用System.Timers.Timer
以频繁的间隔运行代码。 OnStop
和OnPause
处理程序使用一些信号与定时器线程一起检查定时器是否仍在运行并等待它结束。
在这种情况下是否有推荐的处理延迟错误的方法,例如处理程序是否在等待计时器线程停止的不可接受的长时间?
我应该继续等待,直到SCM放弃(但是这将使服务进入一种状态,除了杀死进程之外,对服务不能做任何事情,有时候重启是唯一的方法)。 或者我可能会抛出一个exception(这会使其处于类似的状态,还是放弃停止/暂停请求)?
如果我可以拒绝暂停/停止的请求,并让SCM将其保留在用户可以尝试暂停/再次停止的状态,我宁愿这样做。 我可以中止计时器线程,但是有时它会locking在其他资源上,我宁愿等待直到完成,并且只有在pipe理员能够稍后尝试停止时logging错误。
您可以使用RequestAdditionalTime方法通知SCM您需要更多时间来停止/暂停您的服务。
我反对SCM放弃了我的头,导致我的服务像在六月份在南极洲晒日光浴一样冻结起来。
对我而言,问题在于服务做了一些处理,可能会花费比SCM更愿意等待响应停止请求的时间。
我喜欢我的软件开始/退出/暂停,甚至优雅地死亡。
我实现的解决方案是使用配置文件。 我把一个ExecutionMode参数在文件中。 在每个处理循环开始时,它检查配置文件 – 如果ExecutionMode是暂停或停止 ,则执行代码来改变状态,并使用SMTP向ServiceChangeNotification参数中列出的电子邮件ID发送电子邮件。 电子邮件中包含的机器名称,时间戳,服务名称,旧状态,旧状态开始时间,当前状态,当前状态开始时间,日志详细信息。