这对于Windows服务中的线程来说是一个合理的策略

时间:2011-02-15 02:46:29

标签: multithreading windows-7 .net-4.0 c#-4.0 windows-server-2008

在我的OnStart中,我将HKLM注册表值设置为“是”。

然后我实例化一个c#类,它以线程的形式启动其中一个方法。

该方法处理来自远程服务的记录然后休眠。

当它醒来时,如果注册表项仍然是“是”,它将处理来自远程源的更多记录。

OnStop将HKLM键设置为“No”并返回。

我不确定幕后会发生什么......似乎至少有两种可能性。

(A)服务在OnStop退出后停止,但线程一直运行,直到它被唤醒并退出。

(B)服务等待线程结束然后退出。

我猜(A)但我真的不知道。

无论哪种方式,这是一个合理的策略吗? thnx / g。

2 个答案:

答案 0 :(得分:0)

我更喜欢使用Timer。在服务类中创建一个静态计时器变量,每次计时器结束时都会启动处理事件。在OnStop中,只需关闭计时器即可。

答案 1 :(得分:0)

我不会使用注册表这样的东西。您希望通知工作线程是时候退出,让它自己退出,但是您可以比使用注册表做得更好。

使用bool“keepRunning”变量而不是使用注册表。有一个“workInterval”设置/变量,指示工作应该完成的频率,但设置你的睡眠间隔足够短,比如每隔几秒钟,唤醒并经常检查“keepRunning”变量,以便服务可以响应停止命令。如果“keepRunning”测试为false,则退出主循环,服务进程将结束。如果“keepRunning”为真,那么测试是否是时间做工作,如果是时间就做工作,然后再次睡觉。如果工作很长,请考虑从工作循环中经常检查“keepRunning”变量,以便在服务应该关闭的情况下保存状态并优雅地退出。

您的OnStop处理程序只会将“keepRunning”设置为false,而不执行任何其他操作。这样您就不需要使用Thread.Abort强制杀死worker,并且服务进程将在OnStop事件的几秒钟内关闭。