Событие System.Timers.Timer из завершенного потока - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть служба C #, над которой я работаю, которая будет загружать информацию через WMI на различные серверы в сети.Я настроил его так, чтобы каждый сервер был представлен экземпляром моего класса ServerInfo.В основной программе она инициализирует конфигурацию и перебирает ArrayList серверов, начиная рабочие потоки, используя ThreadPool.QueueUserWorkItem для инициализации или обновления каждого сервера.

Я хочу обновить каждый сервер в фоновом режимепосле того, как количество времени, указанное в конфиге проходит.Моей первой мыслью было настроить объект System.Timers.Timer в каждом экземпляре сервера, и после завершения многопоточного метода обновления запустите таймер.Основная программа будет ожидать истекшее событие и снова запустит метод обновления для этого экземпляра сервера.

Однако, похоже, что после завершения рабочего потока таймер не работает и никогда не отправляетистекшее событие (кажется очевидным, поскольку объект больше ничего не обрабатывает).

Что я должен сделать, чтобы разрешить запуск обновлений, подобных этому?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2011

System.Timers.Timer, вероятно, работает не так, как вы ожидаете, так как использует сообщения Windows, поэтому для этого требуется насос сообщений, которого у вас нет в ваших потоках. Вместо этого посмотрите в System.Threading.Timer.

Но мой основной ответ противоположен ответу Криса Хогана. Не делайте потоки внутри объектов, но в основном коде приложения или, по крайней мере, в слое.

Итак ... вы создаете все свои ServerInfo, которые на данный момент содержат только метаданные, например, имя компьютера.

Затем вы запускаете отдельный поток с помощью System.Threading.Thread, блокируете ArrayList объекта ServerInfo, получаете копию ArrayList, затем выполняете итерацию по нему и вызываете метод Update () для каждого ServerInfo.

Вы можете инициировать событие после каждого обновления или после того, как все они обновятся.

Не забудьте перенаправить вызов из обработчика событий ServerInfo. Обновлен до основного потока! В противном случае вы задержите следующий цикл обновления. И это требование, если вы хотите изменить свойства пользовательского интерфейса.

0 голосов
/ 15 февраля 2011

Что ж, моя первая мысль - сделать так, чтобы класс ServerInfo обрабатывал внутреннее обновление.Конструктор ServerInfo может запустить таймер или использовать QueueUserWorkItem, чтобы запустить поток обновления.Таким образом, вам не придется управлять всей логикой обновления в основной программе.

Класс ServerInfo может иметь событие, на которое основная программа подписывается для получения обновлений.

Нет необходимости ставить рабочий поток в очередь для запуска таймера.Просто сделайте это в главном потоке (т. Е. В конструкторе для ServerInfo)

Конечно, я не на 100% уверен в том, что вы пытаетесь выполнить, так что это может не соответствовать вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...