(Win/C#/.Net) Апплету необходимо проводить опрос с ежечасным интервалом – рекомендации по лучшему методу?

StackOverflow https://stackoverflow.com/questions/1538925

  •  20-09-2019
  •  | 
  •  

Вопрос

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

Ищем реализацию, которая будет наиболее экономичной с точки зрения использования системных ресурсов, особенно процессора и оперативной памяти. Больше всего беспокоит реализация синхронизации/опроса по сравнению сИспользование процессора. Не будет тонны объектов, графического интерфейса и т. д.создано, поэтому использование оперативной памяти не должно быть большой проблемой, но нужно ли мне уделять особое внимание сборке мусора, если я реализую его как долгоиграющий .exe (в смысле месяцев/лет)?

ФайлСистемВатчер?
System.Timers.Timer?
Тема.Спать?
другой?

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

Это было полезно?

Решение

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

Другие советы

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

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

Не нужно слишком усложнять ситуацию.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top