(Win / C # /. Net) Апплет должен опрашивать с почасовым интервалом - рекомендации по лучшему методу? - PullRequest
2 голосов
/ 08 октября 2009

Апплет должен опрашивать о существовании каталога, скажем, каждые 1-4 часа, и отправлять пару электронных писем / NET SENDs, если он не найден. Пока не уверен в точном интервале, но он определенно не будет короче 1 часа. Общая «работа» будет постоянной и продолжительной в обозримом будущем. Апплет будет работать на сервере Win2k3, и, основываясь на (очень легких) шаблонах использования пользователями, я сомневаюсь, что он каким-либо заметным образом повлияет на основные функции сервера, но, разумеется, просто хочу, чтобы он работал хорошо! Предполагается, что в конечном итоге он будет реализован как служба Win, но по разным причинам первая реализация будет в виде консольного приложения.

В поисках реализации, которая будет наиболее экономной с точки зрения использования системных ресурсов, в частности процессора и оперативной памяти. Больше всего беспокоит реализация времени / опроса и загрузка ЦП. Не будет создано тонны объектов, GUI и т. Д., Поэтому использование ОЗУ не должно быть большой проблемой, но мне нужно уделить особое внимание сборке мусора, если я реализую ее как долговременный .exe (в смысле месяцев / лет)?

FileSystemWatcher
System.Timers.Timer
Thread.Sleep
другой

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

Ответы [ 5 ]

1 голос
/ 08 октября 2009

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

Не нужно слишком усложнять вещи.

1 голос
/ 08 октября 2009

Используйте Windows Scheduling Services для планирования работы вашего консольного приложения. Сделайте простую проверку каталога с помощью Directory.Exists и при необходимости отправляйте электронные письма.

0 голосов
/ 08 октября 2009

Мы пытались написать инструменты, аналогичные службам Windows (как вы сказали, в будущем), по нескольким причинам:

  • Простое удаленное администрирование через NET.EXE (и, возможно, PowerShell)
  • Простой мониторинг с помощью System Center Operations Manager (ранее MOM)
  • Может кэшировать данные / объекты при необходимости
  • Стандартизация

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

0 голосов
/ 08 октября 2009

Задача Windows по расписанию - это, безусловно, путь. И Thread.Sleep (n) определенно не путь. A System.Timers.Timer был бы подходящим вариантом, если бы вы собирались сделать это из своего приложения с начальным интервалом 3600000. В каждом Elapsed событии вы должны отключить Timer, делать любой код, который вам нужно сделать, затем повторно - включить таймер с интервалом, равным следующему часу за часом, минус текущее системное время. В противном случае ваш таймер будет не синхронизирован с системным временем (хотя это может не иметь значения для ваших целей, в этом случае, к черту).

0 голосов
/ 08 октября 2009

В прошлом я выполнял такие задачи, просто создав консольное приложение и выполнив его из запланированной задачи Windows. Таким образом, он может выполнять свои действия, а затем выгружается из памяти. Кроме того, можно легко временно отключить запланированную задачу, если есть работа, которую необходимо выполнить на сервере (например, обновление системы). Кроме того, если необходимо изменить расписание (более / менее часто), интерфейс запланированной задачи уже учитывает несколько запусков.

...