Jamie888 Ответов: 0

Как назначить разные объекты таймера для каждого элемента массива


Привет, у меня есть массив с 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

интервал таймера субъективен по отношению к округлению времени срабатывания. Но да,на тиковом событии запускаются только те, которые квалифицируются.

0 Ответов