我创建了一个Windows服务,该服务每60秒检查数据库中的某个表是否有新行。对于每个新添加的行,我需要在服务器上进行一些繁重的处理,这可能需要超过60秒的时间。
我在服务中创建了一个计时器对象,它每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...
}
}
现在,我在思考 -
如果我的计时器滴答作响,发现数据库上有很多新行,并且现在处理需要超过60秒,那么下一个滴答将不会进行任何处理,直到上一个完成。这就是我想要的效果。
但现在,当第一次处理完成后,serviceTimer_Elapsed方法会立即触发吗,还是它会等待计时器再次滴答?
我想要的是 - 如果处理需要超过60秒,则计时器将注意到线程被锁定,并等待另外60秒才能再次检查,以便我永远不会陷入等待前一个处理完成的线程队列中。
我如何实现这个结果?
在这方面有什么最佳实践吗?
谢谢!
lock (this)
- https://dev59.com/kXVC5IYBdhLWcg3wjyDu - Tim Robinson