在Windows服务中使用Thread.Sleep()函数

15
我正在编写一个Windows服务,需要长时间休眠(最长15个小时,最短30分钟)。我目前使用Thread.Sleep(calculatedTime)方法将代码置于休眠模式。Thread.Sleep是最好的选择,还是应该使用计时器?我已经搜索了一段时间,但找不到简明扼要的答案。由于这是一个Windows服务,我不必担心锁定UI,因此我想不到不使用Thread.Sleep的理由。
欢迎提供任何见解。
5个回答

20

我会使用计时器,而不是 Thread.Sleep,后者可能会导致阻塞,从而防止服务关闭。

如果时间间隔很宽泛并且规律,您可以将其安排为计划任务。但是,如果您要处理较长的非一致性时间间隔,则使用计时器更好。


10

由于服务可能随时被服务控制管理器要求停止,因此您的线程应始终准备好响应这些请求,因此您不应使用Thread.Sleep()。相反,在主线程中创建一个手动重置事件,并在工作线程中使用其WaitOne方法和超时。当时间到期时,WaitOne将返回false。

当调用您的服务类的OnStop或OnShutdown方法时,请设置事件,这将导致WaitOne返回true,然后您可以退出工作线程。


8

在很多情况下,使用Thread.Sleep()被普遍认为是不好的做法。

如果你想让服务在后台运行,你应该使用一个计时器。

如果服务只需要按照预定间隔运行,我建议你考虑使用Windows任务计划程序,让Windows在需要时运行应用程序。


6
你不应该预先计算如此长时间的睡眠。最好只睡一分钟,然后醒来重新计算时间。我假设计算非常便宜,或者可以通过缓存使其变得非常便宜。我的建议旨在缓解的问题是,电脑时钟因网络时间服务校准时间漂移,夏令时以及用户调整时钟而出现意外变化。因此,即使意味着每分钟醒来一次,也最好为这样长的时间间隔不断重新计算时间。如果你醒来发现时间“回到过去”,也不要惊讶(即不要断言),时钟可能会向后调整。

1
另一个需要考虑的问题是线程是有限资源,每个线程都会消耗一部分内存(1MB?)用于其堆栈。它们还可能增加调度程序的负载。
现在,如果您的服务没有做太多其他事情,浪费的空间微不足道,但在开始分配多个线程之前了解这一点是明智的。使用线程池和/或计时器更加高效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接