如何在循环内计时

本文关键字:循环 | 更新日期: 2023-09-27 18:01:44

我想在不同的时间间隔发送今天的提醒。我写的代码如下,但它从不调用方法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();
}

如何在循环内计时

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

for循环体内创建一个i的副本,并在该副本上关闭。

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