Вам нужно изменить
item.hasSpecificTime && !item.Done && SpecificTime == DateTime.Now
на
item.hasSpecificTime && !item.Done && SpecificTime <= DateTime.Now
, иначе вы будете почти на всех событиях.
Если ваш timerList
станет большим, вы должны двигаться завершеннымэлементы в отдельный список вместо этого, чтобы избежать циклического повторения множества завершенных элементов.
Редактировать
Вам также необходимо увеличить SpecificTime
с Interval
для повторяющихся событий.
Вы можете создавать более сложные схемы, но ваш код прост для чтения и понимания, и это очень важно.
Одна из схем, которую вы можете использовать, - хранить экземпляры MyTimer
вупорядоченная очередь, в которой вы держите ближайший SpecifiedTime
первым.Затем вы можете запланировать TimerCallback на продолжительность до первого элемента в очереди вместо того, чтобы повторно опрашивать полный список.Тебе тоже нужно вести бухгалтерию.Если вы вставляете новый элемент в очередь, и этот элемент оказывается следующим из выполняемых (появляется первым в очереди), вам необходимо отменить и перезапустить таймер.
Это более «элегантно», нонеобходимо, только если у вас много событий и у вас проблемы с производительностью (или разрешение 1000 мс недостаточно детализировано).