Ogólnie z usługami zadanie, które chcesz wykonać, powtarza się, może w pętli lub może wyzwalaczem, a może czymś innym.Górna półka - pętle do obsługi
Używam Topshelf do wykonania powtarzanego zadania dla mnie, w szczególności używam funkcjonalności Shelf'ing.
Problem, który mam, to sposób obsługi pętli zadania.
Podczas rozruchu spinania usługę w Topshelf, przekazać mu klasę (w tym przypadku ScheduleQueueService
) i wskazać, jakie jest jego metoda Start
i to Stop
metoda:
Przykład:
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());
}
}
Ale w moja metoda StartService()
używam pętli while, aby powtórzyć uruchomione zadanie, ale kiedy próbuję zatrzymać usługę za pośrednictwem usług Windows, nie zatrzymuje się i podejrzewam, że to dlatego, że metoda StartService()
nigdy się nie zakończyła, gdy została pierwotnie wywołana.
Przykład:
public class ScheduledQueueService
{
bool QueueRunning;
public ScheduledQueueService()
{
QueueRunning = false;
}
public void StartService()
{
QueueRunning = true;
while(QueueRunning){
//do some work
}
}
public void StopService()
{
QueueRunning = false;
}
}
jaki jest lepszy sposób to zrobić?
ja uważane za pomocą .NET
System.Threading.Tasks
uruchomić pracę w czym może zamykając wątek na StopService()Może użyciu Quartz powtórzyć zadanie, a następnie wyjmij ją.
Myśli?
Po tych wszystkich latach, każdy wie, czy tak jest w przypadku Topshelf? Nie ma o tym żadnej wskazówki w dokumentacji Topshelf i staram się zdecydować, czy powinienem systematycznie odradzać nowy wątek lub coś podobnego w WhenStarted() w mojej usłudze. – guillaume31