我有一个源自ServiceBase
的Windows服务类,它使用System.Timers.Timer
以频繁的间隔运行代码。 OnStop
和OnPause
的处理程序使用计时器线程的一些信号来检查计时器是否仍在运行并等待它完成。
在这种情况下是否有推荐的处理延迟错误的方法,例如处理程序是否等待计时器线程停止的时间长得令人无法接受?
我是否应该继续等待直到SCM放弃(但这会使服务进入一种状态,除了杀死进程外你无法对服务做任何事情,有时重启是重启它的唯一方法) ?或者我可能会抛出异常(这会使它处于类似的状态,还是只是中止停止/暂停请求)?
如果我可以拒绝暂停/停止请求并让SCM将其置于用户可以尝试再次暂停/停止的状态,我更喜欢它。我可以中止计时器线程,但有时它会被锁定在其他资源上,我宁愿等到完成,只是记录了一个错误,管理员可以在以后尝试停止。
答案 0 :(得分:2)
您可以使用RequestAdditionalTime方法通知SCM您需要更多时间来停止/暂停服务。
答案 1 :(得分:1)
我对抗SCM放弃了我的头,导致我的服务冻结,就像六月份在南极洲晒日光浴一样。
对我来说,问题是该服务进行了一些处理,可能需要的时间比SCM愿意等待它响应停止请求的时间要长。
我喜欢我的软件开始/退出/暂停甚至优雅地死去。
我实施的解决方案是使用配置文件。我在文件中放了一个ExecutionMode参数。在每个处理循环开始时,它会检查配置文件 - 如果ExecutionMode是暂停或停止,那么它会执行代码来更改状态并使用SMTP发送电子邮件到ServiceChangeNotification参数中列出的电子邮件ID。电子邮件中包含的详细信息包括计算机名称,时间戳,服务名称,旧状态,旧状态开始时间,当前状态,当前状态开始时间,日志详细信息。