我想在不同的时间间隔发送今天的警报。我编写了如下代码,但它从不调用方法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();
}
答案 0 :(得分:0)
您正在关闭循环变量i
。闭包关闭变量,而不是值,因此计时器的事件在触发时使用i
的值,而不是在添加处理程序时。在那个时间点,i
的值在集合结束之后,因此事件只会使索引超出范围异常。
在i
循环体内创建for
的副本,然后关闭该副本。
那,或者使用foreach
循环来迭代AlertForToday
而不是for
循环,因为在每次迭代时都会重新创建foreach
的循环变量,而不是像for
循环那样重复使用相同的变量。