如何在循环内定时?

时间:2015-07-08 05:59:12

标签: c# timer

我想在不同的时间间隔发送今天的警报。我编写了如下代码,但它从不调用方法SendAlert()。我哪里出错?

//AletForToday gives me at what time i need to send alert.
for (int i = 0; i < AlertForToday.Count();i++)
{
    TimeSpan day = new TimeSpan(24, 00, 00);    // 24 hours in a day.
    TimeSpan now = TimeSpan.Parse(DateTime.Now.ToUniversalTime().ToString("HH:mm"));  
    TimeSpan activationTime = TimeSpan.Parse(AlertForToday.dt.ToString("HH:mm"));   // 11:45 pm              
    TimeSpan timeLeftUntilFirstRun = ((day - now) + activationTime);
    if (timeLeftUntilFirstRun.TotalHours > 24)
    timeLeftUntilFirstRun -= new TimeSpan(24, 0, 0);
    System.Timers.Timer timers = new System.Timers.Timer();
    timers.Interval = timeLeftUntilFirstRun.TotalMilliseconds;
    timers.AutoReset = false;
    timers.Elapsed += new System.Timers.ElapsedEventHandler((sender, e) =>
    {                        
        SendAlert(AlertForToday[i]);
    });
    timers.Start();
}

1 个答案:

答案 0 :(得分:0)

您正在关闭循环变量i。闭包关闭变量,而不是值,因此计时器的事件在触发时使用i的值,而不是在添加处理程序时。在那个时间点,i的值在集合结束之后,因此事件只会使索引超出范围异常。

i循环体内创建for的副本,然后关闭该副本。

那,或者使用foreach循环来迭代AlertForToday而不是for循环,因为在每次迭代时都会重新创建foreach的循环变量,而不是像for循环那样重复使用相同的变量。