En general, con los servicios, la tarea que desea completar se repite, tal vez en un bucle o tal vez un desencadenador o tal vez algo más.Topshelf - manejo de bucles
estoy usando Topshelf para completar una tarea repetida para mí, en concreto estoy usando la funcionalidad Shelf'ing.
El problema que tengo es cómo manejar el bucle de la tarea.
Cuando arranque flejes el servicio en Topshelf, se le pasa una clase (en este caso ScheduleQueueService
) e indicar cual es su método Start
y es Stop
método:
Ejemplo:
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());
}
}
Pero en my StartService()
método Estoy usando un ciclo while para repetir la tarea que estoy ejecutando, pero cuando intento detener el servicio a través de los servicios de Windows, no se detiene y sospecho que es porque el método StartService()
nunca finalizó cuando se llamó originalmente.
Ejemplo:
public class ScheduledQueueService
{
bool QueueRunning;
public ScheduledQueueService()
{
QueueRunning = false;
}
public void StartService()
{
QueueRunning = true;
while(QueueRunning){
//do some work
}
}
public void StopService()
{
QueueRunning = false;
}
}
lo que es una mejor manera de hacer esto?
he considerado utilizando .NET
System.Threading.Tasks
para ejecutar el trabajo y entonces tal vez el cierre de la rosca en StopService()Tal vez usando Quartz a repetir la tarea y luego eliminarlo.
¿Pensamientos?
Después de todos estos años, nadie sabía si de hecho es también el caso de Topshelf? No hay ningún indicio de que en la documentación Topshelf y yo estoy luchando para decidir si debería generar sistemáticamente un nuevo hilo o algo similar sobre WhenStarted() en mi servicio. – guillaume31