Обычно в сервисах задача, которую вы хотите выполнить, повторяется, может быть в цикле, может быть триггером или может быть чем-то еще.
Я использую 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;
}
}
какой лучший способ сделать это?
Я думал использовать System.Threading.Tasks
для запуска работы в .NET и затем, возможно, закрыть поток на StopService()
Возможно, использовать Quartz для повторения задачи и затем удалить ее.
Thoughts?