Хороший способ запустить событие в определенное время суток? - PullRequest
5 голосов
/ 07 апреля 2009

У меня есть приложение, которое должно запускать пару событий в определенное время в течение дня - время определяется пользователями. Я могу придумать пару способов сделать это, но ни один из них не сидит слишком хорошо. Время не должно быть особенно высокого разрешения - минута или около того, все в порядке.

Мои идеи:

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

  2. Запустить таймер, который каждую минуту будет проверять наличие «текущих событий»

TIA для любых лучших решений.

Ответы [ 6 ]

4 голосов
/ 07 апреля 2009
  • Сохранение / индексирование событий, отсортированных по следующим моментам, когда они требуют внимания. Это может быть в памяти или не в зависимости от того, сколько их существует, как часто вы вносите изменения и т. Д. Если все ваши события запускаются один раз в день, этот список в основном представляет собой кольцевой буфер, который изменяется только тогда, когда пользователи изменяют свои события.
  • Запустите таймер, который будет «тикать» во время события в начале списка. Если хотите, округлите до следующей минуты.
  • Когда сработает таймер, обработайте все события, которые сейчас находятся в прошлом [править - и которые еще не были обработаны], при необходимости вставьте их в список (т. Е. Если у вас нет «Оптимизация буфера» и установить новый таймер.

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

Возможно, вам следует использовать существующий фреймворк, а не использовать собственный, но я не знаю C #, поэтому понятия не имею, что доступно. Я, как правило, немного опасаюсь идеи установки миллиардов таймеров, потому что некоторые среды не поддерживают это (или не поддерживают это хорошо). Отсюда и эта схема, которая требует только одного. Я не знаю, есть ли у C # какие-либо проблемы в этом отношении, но эта схема может быть легко организована так, чтобы при необходимости использовать О (1) ОЗУ, которое невозможно обойти.

4 голосов
/ 07 апреля 2009

Взгляните на Quartz.Net . Это структура планировщика (изначально для Java).

3 голосов
/ 07 апреля 2009

Это звучит как классический случай для службы Windows. Я думаю, что есть тип проекта Windows Service в VS2005 / 2008. Служба в сочетании с простой базой данных и внешним приложением, позволяющим пользователям устанавливать время запуска, - это все, что вам нужно.

Если это не будет меняться очень часто, то Запланированные задачи также вариант.

1 голос
/ 07 апреля 2009

Я написал несколько программ в этом направлении.

Я предлагаю # 2. Все, что вам нужно - это вести список случаев, когда события «должны», и каждый X промежуток времени (в зависимости от вашего разрешения) проверять ваш список на «сейчас» события. Вы можете выбрать некоторую оптимизацию, если можете гарантировать, что список отсортирован, и что каждое событие в списке должно быть выполнено ровно один раз. В противном случае, если у вас есть повторяющиеся события, вы должны убедиться, что вы закрываете свое окно. Я имею в виду, что если у вас есть событие, которое должно состояться в 11:30 утра, и вы проверяете каждую секунду, то возможно, что вы можете проверить в 11:29:59, а затем снова до 11:31: 01, из-за неточности временных интервалов ЦП. Таким образом, вам нужно быть уверенным, что одна из этих проверок (11:29 или 11:31) по-прежнему подхватывает попадание 11:30, и что ТОЛЬКО одна из них делает (т.е. вы не выполняете оба 11: 29 и 11:31).

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

0 голосов
/ 07 апреля 2009

Проблема с # 1 заключается в том, что количество миллисекунд до события может быть слишком большим для хранения в интервале таймера, и с увеличением количества событий ваше количество таймеров может стать неприветливым.

Я не вижу ничего плохого в # 2, но я бы выбрал фоновый рабочий или поток.

0 голосов
/ 07 апреля 2009

Самый простой способ - использовать планировщик Windows.

В противном случае вам нужно использовать один из классов Timer, рассчитывая, как долго до первого события. Этот подход, в отличие от планировщика, позволяет обнаруживать новые события запущенным процессом (и, возможно, сбрасывать таймер).

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