如何在循环内计时
本文关键字:循环 | 更新日期: 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
循环那样重复使用相同的变量。