Служба Windows, чтобы делать работу каждые 6 часов - PullRequest
2 голосов
/ 20 ноября 2011

У меня есть служба Windows только с двумя методами - один закрытый метод DoWork() и открытый метод, который вызывает метод DoWork.Я хочу добиться следующего:

  • Служба Windows запускает DoWork() метод каждые 6 часов
  • Внешняя программа также может вызывать открытый метод, который вызывает метод DoWork().Если служба уже выполняет этот метод, вызванный из службы, после завершения текущего метода снова будет вызван DoWork().

Какой наилучший подход к этой проблеме?Спасибо!

Ответы [ 4 ]

7 голосов
/ 20 ноября 2011

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

Второй вопрос: когда вы подходите к консольному приложению, его можно вызвать, вызвавнапример, Process.Start .

5 голосов
/ 20 ноября 2011

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

Если вы все еще убеждены, что нуждаетесь в услуге (и, честно говоря, из того, что я видел до сих пор, похоже, что вы этого не делаете), вам следуетизучите использование таймера, но тщательно выберите таймер и прочитайте эту статью , чтобы лучше понять таймеры, встроенные в .NET (Подсказка: обратите особое внимание на System.Timers.Timer ).

Чтобы предотвратить повторный вход, если другой метод пытается вызвать DoWork (), когда процесс находится в середине выполнения своей операции, используйте Mutex или Семафор .

3 голосов
/ 20 ноября 2011

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

другой вариант, который вы могли бы рассмотреть, - это использование nservicebus sagas.Саги действительно предназначены не только для планирования задач (они сохраняют состояние для процессов типа рабочих процессов, которые длятся дольше, чем длительность одного запроса / сообщения), но у них есть хороший способ обработки периодических или основанных на времени процессов (чтобольшая часть длительных рабочих процессов).тем, что сага может запросить, чтобы она возвратила сообщение от менеджера тайм-аута в то время, когда она запрашивает.Использование nservicebus - это более сложный архитектурный вопрос, и, вероятно, он выходит далеко за рамки того, о чем вы здесь говорите, но саги стали тем, как я думаю о периодических процессах, и это дает дополнительное преимущество, заключающееся в возможности управлять некоторым постоянным состоянием для вашего процесса (которыйможет или не может быть проблемой) и дает вам повод задуматься о некоторых архитектурных вопросах, которые, возможно, вы не рассматривали ранее.

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

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

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