Как правило, с сервисами задача, которую вы хотите выполнить, повторяется, может быть, в цикле, может быть, триггер или, может быть, что-то еще.
Я использую Topshelf для выполнения повторяющейся задачи, в частности, я использую функцию Shelf'ing.
Проблема, с которой я сталкиваюсь, заключается в том, как справиться с зацикливанием задачи.
При загрузке службы в Topshelf вы передаете ей класс (в данном случае ScheduleQueueService
) и указываете, какой метод Start
, а какой метод Stop
:
Пример:
public class QueueBootstrapper : Bootstrapper<ScheduledQueueService>
{
public void InitializeHostedService(IServiceConfigurator<ScheduledQueueService> 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;
}
}
как лучше это сделать?
Я рассматривал возможность использования .NET
System.Threading.Tasks
для запуска работы, а затем, возможно, закрытия потока в StopService().Возможно, используя Quartz, чтобы повторить задачу, а затем удалить ее.
Мысли?