【发布时间】:2011-03-26 09:23:54
【问题描述】:
我创建了一个 Windows 服务,它应该每 60 秒检查一次数据库中的某个表是否有新行。对于添加的每一行,我需要在服务器上进行一些繁重的处理,有时可能需要超过 60 秒。
我在我的服务中创建了一个 Timer 对象,它每 60 秒计时一次并调用所需的方法。
由于我不希望这个计时器在处理找到的新行时计时,所以我将该方法包装在 lock { } 块中,因此其他线程将无法访问它。
看起来像这样:
Timer serviceTimer = new Timer();
serviceTimer.Interval = 60;
serviceTimer.Elapsed += new ElapsedEventHandler(serviceTimer_Elapsed);
serviceTimer.Start();
void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (this)
{
// do some heavy processing...
}
}
现在,我想知道 -
如果我的计时器滴答作响,并且在 db 上发现了很多新行,现在处理将花费 60 秒以上,那么下一个滴答将不会进行任何处理,直到前一个完成。这就是我想要的效果。
但是现在,serviceTimer_Elapsed 方法会在第一次处理完成后立即关闭,还是等待计时器再次计时。
我想要发生的是 - 如果处理需要超过 60 秒,那么计时器会注意到线程被锁定,然后再等待 60 秒再次检查,这样我就永远不会陷入有等待前一个线程完成的线程队列。
我怎样才能完成这个结果?
这样做的最佳做法是什么?
谢谢!
【问题讨论】:
标签: c# multithreading windows-services timer