线程计时器以指定的时间间隔连接到数据库(实体框架)C#

时间:2014-08-08 17:59:28

标签: c# multithreading entity-framework timer

我有一个线程计时器(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
}

您是否想知道有关该方法的反馈,因为我是线程新手

1 个答案:

答案 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秒发生。