Служба Windows с несколькими таймерами - PullRequest
4 голосов
/ 10 ноября 2011

Мне была предоставлена ​​служба Windows, написанная предыдущим стажером во время моей текущей стажировки, которая следит за архивом и оповещает определенных людей по электронной почте и во всплывающих окнах, если одно из записанных значений выходит за пределы определенного диапазона. В настоящее время он использует таймер для проверки архива каждые 30 секунд, и меня спросили, смогу ли я обновить его, чтобы можно было выбирать время в зависимости от того, какой «тег» отслеживается. Он использует файл XML для отслеживания того, какие теги отслеживаются. Будет ли создание нескольких таймеров в сервисе наиболее эффективным способом решения этой проблемы? Я не совсем уверен, какой подход выбрать.

Сервис написан на C # с использованием .NET 3.5.

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

В зависимости от степени детализации вы можете использовать один таймер, который является общим фактором желаемых временных интервалов. Скажем, они хотят вставить в файл XML, что каждый архив должен проверяться каждые несколько минут. Вы устанавливаете таймер, который срабатывает раз в минуту, и проверяете, сколько времени прошло с тех пор, как вы сделали каждый, и следует ли это делать или нет.

Если у вас есть возможность изменить архитектуру, я бы перешел от сервиса к набору запланированных задач. Напишите так, чтобы одно задание делало один архив. Затем напишите программу контроллера, которая устанавливает запланированные задачи (и может останавливать их, изменять их и т. Д.). API для запланированных задач в Windows 7 приятен и понятен, и в отличие от сервиса вы можете наложить ограничения типа «не делайте этого» если компьютер работает от батареи »или« делайте это только в том случае, если машина простаивает »вместе с вашими предпочтениями, что делать, если упущен шанс выполнить задачу. 7 или 8 запланированных задач, каждая по своему собственному расписанию, используя один и тот же ваш API, передавая путь к архиву и адрес электронной почты, намного лучше, чем одна служба, пытающаяся совмещать все сразу. Кроме того, машина будет запускаться быстрее, если у вас нет еще одной службы автозапуска.

1 голос
/ 10 ноября 2011

Я бы предложил использовать только один таймер, запланированный для наименьшего общего делителя.

Например, сконфигурируйте ваш таймер так, чтобы он сигнализировал каждую секунду, и вы можете обрабатывать каждый интервал (1 секунда, 2 секунды, ...) путем подсчета соответствующего количества тактов таймера.

1 голос
/ 10 ноября 2011

Эффективное?Возможно, нет - особенно если у вас много тегов, поскольку каждый таймер занимает крошечное, но конечное количество ресурсов.

Альтернативным подходом может быть использование одного таймера, который срабатывает каждую секунду, и когда это происходит, вы проверяетесписок невыполненных запросов.

Преимущество в том, что отладку легче выполнять, если что-то пойдет не так, поскольку существует только один активный поток.

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

...