2015-07-08 2 views
0

Я хочу отправить оповещение на сегодня в разное время. Я написал код следующим образом, но он никогда не вызывает метод 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

Вы закрываете переменную цикла i. Закрытие закрывается над переменными, а не значениями, поэтому событие таймера использует значение i, когда оно срабатывает, а не при добавлении обработчика. В этот момент значение i находится после окончания коллекции, поэтому событие только бросает исключение индекса за пределами диапазона.

Создайте копию i внутри тела цикла for и закройте эту копию.

Это, или использовать foreach цикл для перебора AlertForToday, а не for петли, так как переменная петля foreach создается заново на каждой итерации, а не повторно используя ту же переменную, как for петли.