以下是我的目标概述:
我有一个Windows服务,在启动时,将检查该服务器上的特定数据库是否有任何可用的队列。如果找到一个队列,它必须开始处理(非常简单和直接)。如果没有找到队列,我需要服务“睡眠”15分钟,然后“重新启动”。如果找到了队列,则开始处理否则再睡15分钟并“重新启动”。
我该怎么做呢?我查看了System.Threading.Sleep方法,但显然编码很差。我知道睡眠线程会阻止任何连续的方法被执行,这很好 - 因为在睡眠之后,服务将调用相同的方法来“重启”处理。
我也查看过System.Threading.Timer,但有时系统会完全停止服务。事件查看器中存在一些与某种异常相关的错误,但是当我手动启动服务时,它会自动开始处理队列 - 表明我的编码没有任何问题。
暂停服务线程15分钟的最佳方法是什么,然后再次调用处理方法。它应该保持在不断检查可用队列的循环中。一旦找到,进行处理,如果没有找到,只需睡15分钟?
答案 0 :(得分:0)
如果你确实想睡觉,只需拨打Thread.Sleep
即可。在最基本的术语中,线程的主执行循环如下所示:
while (true)
{
if (!queue.processItem())
Thread.Sleep(...);
}
您不应该在主服务主题上调用Thread.Sleep
。在后台线程上调用它。所以我的想法是主服务线程保持活跃并准备好处理任何服务消息。后台线程完成了实际的工作。
是的,睡觉是一般要避免的事情。理想情况下,您需要一个阻塞队列,以便在它为空时等待。然后,当项目添加到队列中时,您的线程将被唤醒。