Topshelf - обработка циклов

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

Я использую Topshelf для выполнения повторяющейся задачи для меня, в частности, я использую функциональность Shelf'ing.

Проблема, с которой я столкнулся, заключается в том, как обработать зацикливание задачи.

При загрузке сервиса в Topshelf вы передаете ему класс (в данном случае ScheduleQueueService) и указываете, какой его Start метод и какой Stop метод:

Пример:

    public class QueueBootstrapper : Bootstrapper
{
    public void InitializeHostedService(IServiceConfigurator cfg)
    {
        cfg.HowToBuildService(n => new ScheduledQueueService());
        cfg.SetServiceName("ScheduledQueueHandler");
        cfg.WhenStarted(s => s.StartService());
        cfg.WhenStopped(s => s.StopService());
    }
}

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

Пример:

 public class ScheduledQueueService
{
    bool QueueRunning;

    public ScheduledQueueService()
    {
      QueueRunning = false;
     }


    public void StartService()
    {
        QueueRunning = true;

        while(QueueRunning){
                     //do some work
         }
    }

  public void StopService()     
  {
         QueueRunning = false;
  }
}

какой лучший способ сделать это?

  1. Я думал использовать System.Threading.Tasks для запуска работы в .NET и затем, возможно, закрыть поток на StopService()

  2. Возможно, использовать Quartz для повторения задачи и затем удалить ее.

Thoughts?

6
задан SteveC 15 July 2015 в 10:21
поделиться