2010-04-07 17 views
6

Puedo crear un servicio de Windows e instalarlo.Servicio de Windows que se ejecutará cada hora

Tengo curiosidad por cómo puedo ejecutar este servicio cada hora? Quiero que se ejecute cada hora periódicamente.

También necesito saber el rango de horas que está funcionando para que pueda almacenarlo en alguna parte.

¿Cómo puedo hacer eso?

Edit: Este servicio se instalará en muchas máquinas, por lo tanto, no quiero crear una tarea programada, por ejemplo, en 100 servidores.

Respuesta

12

Si desea una tarea se ejecute en un intervalo regular en lugar de constantemente, usted debe buscar en el uso de la Task Scheduler.

Si necesita que su código sea un servicio, pero para ser "activado" cada hora, el enfoque más fácil sería hacer de su servicio un objeto COM y tener una tarea simple programada cada hora que invoque un jscript/vbscript que crea su objeto COM y llama al método simple en él.

La alternativa es utilizar cualquiera de las API de espera para "perder" una hora sin consumir ciclos.

Tenga en cuenta que también hay que tener en cuenta algunas decisiones de diseño interesante que dependen de lo que su escenario es:

  • cómo es su servicio va a ser iniciado si se bloquea o se detiene por el usuario?
  • si se inicia después de más de una hora, ¿debe volver a ejecutar o necesita esperar para obtener el horario exacto?
  • ¿cómo se realiza un seguimiento de la última "activación" de la hora si la zona horaria o el horario de verano ha cambiado mientras no estaba activo?
  • ¿Su servicio impide que la computadora entre en modo de reposo/hibernación al ralentí o cuando la cubierta de la computadora portátil está cerrada? si no, ¿necesita despertar la computadora en una hora para que su servicio funcione de acuerdo con su cronograma?

Algunos de ellos están a cargo del programador de tareas, por lo que recomiendo encarecidamente seguir esa ruta en lugar de esperar una hora en el código.

+0

¿La API de espera desperdicia el ciclo de la CPU? ¿Puedes dar más detalles sobre esto? Esperar es solo un evento planteado por el sistema, no creo que sea una votación para nada. –

+0

No estoy seguro de haberme entendido correctamente. Intenté decir que las API de espera están optimizadas para no usar ciclos de CPU mientras se espera que transcurra un período de tiempo. –

3

Puede crear un scheduled task que se ejecute cada hora, ya sea para ejecutar el servicio o enviar un mensaje para "activarlo". Luego, pase la hora actual en la solicitud de la tarea programada, o simplemente haga que su programa recoja la hora actual cuando se despierte.

Task Scheduler Managed Wrapper puede ayudarlo a configurarlo programáticamente; también puedes buscar otros recursos en google.

+0

pero quiero ser capaz de implementar eso en el código. imagine que este servicio se instalará en muchos servidores, no quiero ir a cada servidor y crear una tarea programada. – DarthVader

+1

@ user177883: puede crear tareas programadas de manera programática igual que puede crear servicios de forma programática. –

3

Hay un par de opciones.

  1. Puedes dormir durante una hora.
  2. Puede que sea más adecuado para una Tarea programada, no un servicio.
2
Thread.Sleep(1000*60*60); 
+2

¿Qué sucede si intenta detener el servicio mientras duerme durante una hora? –

2
Thread.Sleep(TimeSpan.FromHours(1)); 

código sea más legible esta manera

solución
2

Thread.Sleep() se asegurará de que su servicio se ejecutará en intervalos de una hora, no cada hora, es decir cada tarea se iniciará a 1 hora + tiempo para ejecutar la tarea. Considere usar un Timer dentro de su servicio. Esta será una solución más robusta ya que tiene un control sobre cuándo ejecutar una tarea, monitorear su progreso, etc. Solo recuerde que cada evento Timer se disparará con un hilo diferente y si la tarea tarda más de una hora en ejecutarse, es posible que tenga esperar a que termine la primera tarea para evitar tareas concurrentes.

0

Los programadores de tareas pueden ser una buena idea pero los servicios están diseñados para hacer esto. Los servicios se instalan fácilmente y registran las cosas correctamente. Todo lo que necesita hacer es, al inicio del servicio, puede instalar un temporizador del sistema (System.Threading.Timer) o también hay un temporizador más.

Cuestiones relacionadas