Как назначить разные объекты таймера для каждого элемента массива
Привет, у меня есть массив с 3 элементами, например:
string[] message = {"how", "are", " you"};
Для каждого элемента я назначу событие таймера с разной длительностью. Например, "как" будет отображаться в течение одной минуты," есть "- 30 секунд, а" вы " - 2 минуты. Я успешно добавил таймер только для одного элемента, который является "вы", так как я использую цикл for для итерации по каждому из них, но понимаю, что это не правильный метод, так как продолжительность предыдущих двух элементов будет перезаписана последней длительностью, которая составляет 2 минуты.
Кроме того, если какой-либо из таймеров заканчивается, например "are" закончится первым, так как он имеет только 30 секунд продолжительности, то система будет запускать другие 2 элемента для моих пользователей, которые являются "how" и "you" соответственно, и снова только "you" после истечения срока действия "how".
Я понятия не имею, как мне следует действовать со своей функциональностью. Ниже приведены мои текущие коды:
public string NotifyAllClients(string application, string region, string[] message) { if (message.Count() > 0) { //begin countdown of duration using timer class CountDownTimer(message); //send message to users Clients.Group(application).NotifyAllClients(region, message); } return "Success!!"; }
public void CountDownTimer(string[] messageWithDuration) { //loop through the array to assign each elements with duration foreach (string msg in messageWithDuration) { notificationList.ModelList.Add(new NotificationModel() { Message = msg, DisplayFlag = true }); //hardcoded a value here for testing, clueless on how to assign different //value counterTimerValue = 120; //2 minutes in seconds displayTimer.Interval = 1000; // 1 second displayTimer.Elapsed += new ElapsedEventHandler(timerTick); displayTimer.Enabled = true; displayTimer.Start(); } }
private void timerTick(Object source, EventArgs e) { counterTimerValue--; if (counterTimerValue == 0) { displayTimer.Stop(); try { List<string> list = new List<string>(); //hardcoded the first element for flag false to filter out itself //should have according to timer which has reach 0 notificationList.ModelList[0].DisplayFlag = false; //only resend the message with flag as true notificationList.ModelList = notificationList.ModelList.Where(x => x.DisplayFlag == true).ToList(); foreach(NotificationModel model in notificationList.ModelList) { list.Add(model.Message); } messageContent = list.ToArray(); Clients.Group(application).NotifyAllClients(region, message); } catch (Exception) { } } }
Я прокомментировал некоторые коды, чтобы упростить опубликованный вопрос.
Что я уже пробовал:
1. Поиск в интернете идей / мозговой штурм, но безрезультатно.
Graeme_Grant
Многократные таймеры такого рода очень неэффективны.
Вам было бы лучше иметь один таймер, который каждую секунду проверяет список объектов со свойством NotifyTime DateTime. Затем вы просто сверяете текущее время с NotifyTime и запускаете те, которые требуют запуска.
Jamie888
Сэр, вы имеете в виду получение этих 3 различных длительностей и установку одного таймера для проверки каждой из них каждую секунду и запуска требуемой логики, как только время для любой из них истекает?
Graeme_Grant
интервал таймера субъективен по отношению к округлению времени срабатывания. Но да,на тиковом событии запускаются только те, которые квалифицируются.