Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.118.198] |
|
Сообщ.
#1
,
|
|
|
Есть задача с определенным интервалом времени производить проверку связи (пинг) с хостами. Список (ip-адреса) хостов и необходимая периодичность проверки связи находятся в таблице.
Вопрос: Как лучше организовать архитектуру данного приложения? Сейчас я упростил задачу и периодичность задаю одним таймером, по событию которого вызывается пинг хостов (т.е. все ip-адреса пингуются с одинаковой периодичностью): 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-адреса индивидуально и при этом сохранить многопоточность? |
Сообщ.
#2
,
|
|
|
Цитата vblamer @ - держать по таймеру на IP адрес (System.Threading.Timer) - все равно все таймеры обслуживаются одним потоком организовать работу, чтобы можно было задавать периодичность пинга каждого ip-адреса индивидуально и при этом сохранить многопоточность? |
Сообщ.
#3
,
|
|
|
Не совсем понял, как можно держать по таймеру на ip-адрес... Адреса ведь берутся из таблицы и могут добавлятся/удалятся. Или имеется в виду массив программно добавляемых таймеров? Можно показать в виде кода?
|
Сообщ.
#4
,
|
|
|
vblamer -
типо: Dictionary<string, System.Threading.Timer> timers = new Dictionary<string, System.Threading.Timer>(); Ключем будет IP адрес, значением - таймер, который его обслуживает. Только нужно продумать вопросы синхронизации - компы включаются, выключаются и т д |
Сообщ.
#5
,
|
|
|
То, что компы включаются/выключаются -- это всё равно, просто в базу будет записываться таймаут (условно -1).
А вот насчет Dictionary и как отлавливать события у этих таймеров я не понял (по-видимому надо RTFM) |
Сообщ.
#6
,
|
|
|
Цитата vblamer @ А вот насчет Dictionary и как отлавливать события у этих таймеров я не понял - смотри, при старте приложения инициализируешь свой Dictionary списком хостов. (Возможно из конфига вычитываешь + указываешь кастомные тайминги для каждого хоста из того же конфига). - стартуешь в цикле все таймеры и подписываешься одним методом на все. В теле метода смотришь - какой таймер был sender-ом, ищешь связанный с ним IP адрес и выполняешь пинг только для него |
Сообщ.
#7
,
|
|
|
PIL, спасибо! Теперь стало понятней (в теории).
А есть ли ограничения на количество таймеров и потоков(пинг), которые будут из них запускаться? Количество, скажем 200-300, реалистично? |
Сообщ.
#8
,
|
|
|
таймеры обслуживает один поток, не заморачивайся. Для остальных - юзай пул потоков, и тоже не заморачивайся Или ты пингуешь с интервалом в наносекунды?
|