Обычно со службами задача, которую вы хотите выполнить, повторяется, возможно, в цикле или, может быть, в триггере или, может быть, в другом месте.
Я использую Верхняя полка , чтобы выполнить для меня повторное задание, в частности, я использую функциональность Полки.
Проблема, с которой я столкнулся, заключается в том, как справиться с зацикливанием задачи.
При загрузке связывая сервис в 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 ()
Может быть, использовать Кварц , чтобы повторить задание, а затем удалить его.
Мысли