6
votes

Service Windows qui fonctionnera toutes les heures

Je suis capable de créer un service Windows et de l'installer.

Je suis curieux comment puis-je courir ce service toutes les heures? Je veux que cela fonctionne chaque heure périodiquement.

J'ai aussi besoin de connaître l'heure de la plage de l'heure de la marche afin que je puisse le stocker quelque part.

Comment puis-je faire ça?

EDIT: Ce service sera installé sur de nombreuses machines, je ne veux donc pas créer une tâche planifiée par exemple sur 100 serveurs.


0 commentaires

7 Réponses :


3
votes

Vous pouvez créer un Tâche planifiée qui fonctionne toutes les heures, d'exécuter le service ou Envoyez un message à «Réveillez-le». Ensuite, soit transmettre à l'heure actuelle dans la demande de tâche planifiée, ou simplement que votre programme, récupérez l'heure actuelle lorsqu'il se réveille.

Wrapper géré de planificateur de tâches peut vous aider à définir cette option de manière programmatique; Vous pouvez également google pour d'autres ressources.


2 commentaires

Mais je veux être capable de mettre en œuvre cela dans le code. Imaginez ce service sera installé dans de nombreux serveurs, je ne veux pas aller à chaque serveur et créer une tâche planifiée.


@ user177883: Vous pouvez créer des tâches planifiées de manière programmée comme vous pouvez créer des services de manière programmative.



3
votes

Il y a quelques options.

  1. vous pouvez dormir pendant une heure.
  2. Vous pourriez être mieux adapté à une tâche planifiée, pas à un service.

0 commentaires

2
votes
Thread.Sleep(1000*60*60);

2 commentaires

Que se passe-t-il si vous essayez d'arrêter le service pendant qu'il dort une heure?


@Philgan Solution Sleep vs stop ?



12
votes

Si vous souhaitez que une tâche soit exécutée sur un intervalle régulier par opposition à constamment, vous devez rechercher l'utilisation de planificateur de tâches .

Si vous avez besoin de votre code pour être un service, mais pour être "activé" toutes les heures, l'approche la plus simple consisterait à rendre votre service à un objet COM et à avoir une tâche simple planifiée toutes les heures qui invoque un Jscript / VBScript qui crée votre objet COM et appelle une méthode simple sur celle-ci.

L'alternative consiste à utiliser l'une des API d'attente pour "gaspiller" une heure sans consommer de cycles.

Notez que vous devez également prendre en compte des décisions de conception intéressantes qui dépendent de ce que votre scénario est:

  • Comment votre service va-t-il être démarré s'il se bloque ou est arrêté par l'utilisateur?
  • Si vous êtes démarré après plus d'une heure, devriez-vous exécuter à nouveau ou avez-vous besoin d'attendre pour obtenir le calendrier horaire exact?
  • Comment gardez-vous une trace de la dernière fois "activation" si le fuseau horaire ou le temps d'économie de jour a changé pendant que vous n'étiez pas actif?
  • Votre service empêche-t-il que l'ordinateur reste dormir / hiberner sur le ralenti ou lorsque la couverture de l'ordinateur portable est fermée? Sinon, avez-vous besoin de réveiller l'ordinateur sur l'heure pour obtenir votre service de travail sur votre horaire?

    Certaines de celles-ci sont prises en charge par le planificateur de la tâche, alors je recommanderais fortement à ce que la route v. attente d'une heure dans votre code.


2 commentaires

Attendre le cycle de la CPU des déchets d'API? Pouvez-vous élaborer sur ce sujet? Attendez, c'est juste un événement soulevé par le système, je ne pense pas que cela sondre pour quoi que ce soit.


Je ne suis pas sûr de me comprendre correctement. J'essayais de dire que les API d'attente sont optimisées pour ne pas utiliser de cycles de CPU en attendant une période de temps pour s'écouler.



2
votes
Thread.Sleep(TimeSpan.FromHours(1));
code more readable this way

0 commentaires

2
votes

thread.sleep () solution veillera à ce que votre service fonctionnera dans des intervalles d'une heure, pas toutes les heures I.E. Chaque tâche sera démarrée à 1 heure + l'exécution de la tâche. Pensez à utiliser un Minuterie au sein de votre service. Ce sera une solution plus robuste puisque vous avez un contrôle lorsque vous souhaitez exécuter une tâche, surveiller ses progrès, etc. N'oubliez pas que chaque Minuterie sera tiré dans un fil différent et si la tâche prend plus de temps que Une heure à courir, vous devrez peut-être attendre que la première tâche de terminer pour éviter les tâches simultanées.


0 commentaires

0
votes

Les planificateurs de tâches peuvent être une bonne idée, mais les services sont conçus pour le faire. Les services sont installés facilement et se logent correctement. Tout ce que vous avez à faire est, au début du service, vous pouvez installer une minuterie système (System.threading.Timer) ou une minuterie supplémentaire.


0 commentaires