На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Многопоточный пингер
    Есть задача с определенным интервалом времени производить проверку связи (пинг) с хостами. Список (ip-адреса) хостов и необходимая периодичность проверки связи находятся в таблице.
    Вопрос: Как лучше организовать архитектуру данного приложения?

    Сейчас я упростил задачу и периодичность задаю одним таймером, по событию которого вызывается пинг хостов (т.е. все ip-адреса пингуются с одинаковой периодичностью):
    ExpandedWrap disabled
      private void timer1_Tick(object sender, EventArgs e)
              {
                  timer1.Stop();
                  DateTime pingDateTime = DateTime.Now;
       
                  foreach (DataRow dr in dshosts.Tables["Hosts"].Rows)
                  {
                      CPing p = new CPing(dr["ip"].ToString(), pingDateTime);
              //В классе CPing происходит пинг и запись результата в базу
                      Thread thr = new Thread(new ThreadStart(p.Ping));
                      thr.Start();
                  }
                  timer1.Start();
              }


    Но как все-таки правильно организовать работу, чтобы можно было задавать периодичность пинга каждого ip-адреса индивидуально и при этом сохранить многопоточность?
      Цитата vblamer @
      организовать работу, чтобы можно было задавать периодичность пинга каждого ip-адреса индивидуально и при этом сохранить многопоточность?
      - держать по таймеру на IP адрес (System.Threading.Timer) - все равно все таймеры обслуживаются одним потоком
        Не совсем понял, как можно держать по таймеру на ip-адрес... Адреса ведь берутся из таблицы и могут добавлятся/удалятся. Или имеется в виду массив программно добавляемых таймеров? Можно показать в виде кода?
          vblamer -
          типо:
          ExpandedWrap disabled
            Dictionary<string, System.Threading.Timer> timers = new Dictionary<string, System.Threading.Timer>();

          Ключем будет IP адрес, значением - таймер, который его обслуживает. Только нужно продумать вопросы синхронизации - компы включаются, выключаются и т д
            То, что компы включаются/выключаются -- это всё равно, просто в базу будет записываться таймаут (условно -1).
            А вот насчет Dictionary и как отлавливать события у этих таймеров я не понял :(
            (по-видимому надо RTFM)
              Цитата vblamer @
              А вот насчет Dictionary и как отлавливать события у этих таймеров я не понял

              - смотри, при старте приложения инициализируешь свой Dictionary списком хостов. (Возможно из конфига вычитываешь + указываешь кастомные тайминги для каждого хоста из того же конфига).
              - стартуешь в цикле все таймеры и подписываешься одним методом на все. В теле метода смотришь - какой таймер был sender-ом, ищешь связанный с ним IP адрес и выполняешь пинг только для него
                PIL, спасибо! Теперь стало понятней (в теории).
                А есть ли ограничения на количество таймеров и потоков(пинг), которые будут из них запускаться? Количество, скажем 200-300, реалистично?
                  таймеры обслуживает один поток, не заморачивайся. Для остальных - юзай пул потоков, и тоже не заморачивайся :) Или ты пингуешь с интервалом в наносекунды?
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0297 ]   [ 16 queries used ]   [ Generated: 25.04.24, 15:52 GMT ]