我有一个线程计时器(Windows服务)连接到数据库,每隔30秒从指定的表(通过实体框架)读取值并更新其他表值 根据某些条件。
抱歉,我忘了放置源代码var timeInterval = config.GetConfigValue(Constants.SpecifiedTimeInterval); // reading from config file
var timeDuration = config.GetConfigValue(Constants.SpecifiedTimeElapsed); //reading from config file
TimerCallback cb= new TimerCallback(TimerElapsed);
Timer timerForDatabasePolling = new Timer(cb, null, Convert.ToInt32(timeInterval), System.Threading.Timeout.Infinite);
private static void TimerElapsed(object obj)
{
//connecting to
}
您是否想知道有关该方法的反馈,因为我是线程新手
答案 0 :(得分:1)
你的一般方法是合理的,但你有一点问题。
您将Timeout.Infinite
作为最后一个参数传递,这将使您的计时器成为一次性。也就是说,它会在它发射一次之前等待timeInterval
毫秒,然后再也不会再发射。如果你希望它每30秒触发一次,你可以将timeInterval
作为最后一个参数传递,但是如果你的处理时间超过30秒,那么计时器将再次触发并且你有多个回调同时执行。这通常是一件坏事。
您要做的是将计时器初始化为一次性,然后让回调重新初始化它。所以你有:
Timer timerForDatabasePolling = new Timer(
cb,
null,
Convert.ToInt32(timeInterval)
Timeout.Infinite);
在你的回调中:
private static void TimerElapsed(object obj)
{
// Do all the stuff you need to do here.
// When you're done, reset the timer
timerForDatabasePolling.Change(timeInterval, Timeout.Infinite);
}
这可确保您不会获得多个并发回调。下一个回调将在上一次回调完成后30秒发生。