Как иметь петлю в службе Windows без использования таймера

Через каждые 10 секунд я хочу вызвать метод бизнес-уровня из службы Windows (сделанный с использованием C # и .NET). Однако я не хочу использовать событие Timer_Elapsed, поскольку он запускает другой stream / процесс, если первый stream / процесс все еще запущен. Мне просто нужен однопоточный подход, поскольку несколько вызовов одного и того же метода Business создают нежелательные осложнения.

Поэтому я добавил цикл do-while в on_start. Я знаю, что это неверно, поскольку он порождает этот процесс, который становится сиротой, если служба отключена.

Как я могу подойти к этой проблеме?

С уважением, Чак

Есть еще один способ выполнить синхронизированное выполнение, метод WaitHandle.WaitOne () предоставляет аргумент тайм-аута. Это очень хорошо работает в сервисе, поскольку позволяет реализовать необходимость остановки службы и периодического выполнения в одном вызове метода. Шаблон выглядит следующим образом:

Thread Worker; AutoResetEvent StopRequest = new AutoResetEvent(false); protected override void OnStart(string[] args) { // Start the worker thread Worker = new Thread(DoWork); Worker.Start(); } protected override void OnStop() { // Signal worker to stop and wait until it does StopRequest.Set(); Worker.Join(); } private void DoWork(object arg) { // Worker thread loop for (;;) { // Run this code once every 10 seconds or stop right away if the service // is stopped if (StopRequest.WaitOne(10000)) return; // Do work... //... } } 

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

Проверьте это обсуждение и, в частности, ответ jsw. Он предлагает механизм синхронизации для предотвращения множественных одновременных вызовов бизнес-логики. Просто отключить таймер в методе обработчика Elapsed не гарантируется, чтобы предотвратить параллельные вызовы, поскольку обработчик вызывается в отдельном streamе. Используйте блокировку, как предлагает jsw, и остановите таймер в синхронизированном блоке кода.

Кроме того, вы можете использовать Timer и установить для свойства AutoReset значение false . Таким образом, событие Elapsed поднимается только один раз, и вы можете сбросить таймер вручную до конца метода обработчика.

 while(true) { ..do something Thread.sleep( some time or day); } в while(true) { ..do something Thread.sleep( some time or day); } 
  Thread thread; private void DoWork(object arg) { while (true) { // Run this code once every 20 seconds or stop if the service is stopped try { Thread.Sleep(20000); //Do work.... } catch(ThreadInterruptedException) { return; } } } protected override void OnStart(string[] args) { // Start the thread thread = new Thread(DoWork); mWorker.Start(); } protected override void OnStop() { // interrupt thread and wait until it does thread.Interrupt(); thread.Join(); } 
  • Установка программного обеспечения Windows программно
  • Установите службу Windows .NET без InstallUtil.exe
  • Что делает «задержка запуска» в типе запуска для службы Windows?
  • Как связаться с сервисом Windows из приложения, которое взаимодействует с рабочим столом?
  • Служба Windows для постоянной работы
  • FileSystemWatcher Не удается получить доступ к сетевому диску
  • Служба зависает в WaitForExit после вызова командного файла
  • Как запустить службу .NET Windows сразу после установки?
  • System.Drawing в службах Windows или ASP.NET
  • Как я могу запланировать службу Windows C # для выполнения задачи ежедневно?
  • Печать из службы .NET
  • Interesting Posts

    Можете ли вы снять «скриншот» на странице с помощью Canvas?

    C ++ вызывает явный конструктор шаблонов

    Regex.Match целые слова

    Попытка запустить средство создания медиа – «Что-то случилось 0x80070002 – 0x20016»

    Клавиши яркости ноутбука Remap для клавиш Fn + Arrow

    Наличие вывода консольного приложения в Visual Studio вместо консоли

    display: table-cell, не работающая на входном элементе

    Как сбросить bios / rom до заводских настроек, если компьютер даже не запускается

    OSX / Samba – Как автоматически перемонтировать / снова подключиться к дискам, которые были отключены?

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

    Программно найти количество ядер на машине

    Каково фактическое использование Class.forName (“oracle.jdbc.driver.OracleDriver”) при подключении к базе данных?

    Ищете окончательный ответ на доступ к сетевому диску / NAS / SMB-накопителю через Windows 7 HOME и Windows 7 Professional. Возможно ли и как?

    Почему этот общий код компилируется в java 8?

    Как скомпилировать / связать Boost с clang ++ / libc ++?

    Давайте будем гением компьютера.