在我的OnStart中,我将HKLM注册表值设置为“是”。
然后我实例化一个c#类,它以线程的形式启动其中一个方法。
该方法处理来自远程服务的记录然后休眠。
当它醒来时,如果注册表项仍然是“是”,它将处理来自远程源的更多记录。
OnStop将HKLM键设置为“No”并返回。
我不确定幕后会发生什么......似乎至少有两种可能性。
(A)服务在OnStop退出后停止,但线程一直运行,直到它被唤醒并退出。
(B)服务等待线程结束然后退出。
我猜(A)但我真的不知道。
无论哪种方式,这是一个合理的策略吗? thnx / g。
答案 0 :(得分:0)
我更喜欢使用Timer
。在服务类中创建一个静态计时器变量,每次计时器结束时都会启动处理事件。在OnStop
中,只需关闭计时器即可。
答案 1 :(得分:0)
我不会使用注册表这样的东西。您希望通知工作线程是时候退出,让它自己退出,但是您可以比使用注册表做得更好。
使用bool“keepRunning”变量而不是使用注册表。有一个“workInterval”设置/变量,指示工作应该完成的频率,但设置你的睡眠间隔足够短,比如每隔几秒钟,唤醒并经常检查“keepRunning”变量,以便服务可以响应停止命令。如果“keepRunning”测试为false,则退出主循环,服务进程将结束。如果“keepRunning”为真,那么测试是否是时间做工作,如果是时间就做工作,然后再次睡觉。如果工作很长,请考虑从工作循环中经常检查“keepRunning”变量,以便在服务应该关闭的情况下保存状态并优雅地退出。
您的OnStop处理程序只会将“keepRunning”设置为false,而不执行任何其他操作。这样您就不需要使用Thread.Abort强制杀死worker,并且服务进程将在OnStop事件的几秒钟内关闭。