2010-02-16 3 views
4

Je dois implémenter un service Windows qui effectue l'importation de la base de données, et ce une fois par mois. Le programme reçoit les données par e-mail et les importe à la fin de chaque mois.Comment construire une minuterie à très basse résolution?

Existe-t-il un meilleur moyen que de mettre le programme en veille pendant max_integer secondes/millisecondes à plusieurs reprises?

+1

Est-ce que cela crée un service qui se réveillerait une fois par mois? N'est-il pas préférable de créer un programme et de l'organiser chaque mois? Vous pouvez utiliser le planificateur intégré Windows ou nnCron (http://www.nncron.ru/), par exemple, pour cette tâche. –

+1

J'ai eu de bons résultats avec les tâches planifiées sous Windows XP, Vista et Windows 7. –

Répondre

16

Je ne le ferais pas comme un service Windows. Je l'exécuterais comme une tâche planifiée.

Votre service va juste dormir pendant un mois et est juste un gaspillage de ressources. Laissez le système d'exploitation suivre l'heure et démarrez votre application pour effectuer le traitement une fois par mois.

4

Si vous pouvez éviter d'écrire un service de fenêtre, vous allez faciliter votre vie - les tâches planifiées peuvent être une meilleure option ici. Les services Windows sont mieux utilisés pour les tâches nécessitant une activité d'arrière-plan constante et non pour exécuter des tâches sur de longues périodes.

Toutefois, si vous devez définir ce paramètre comme étant un service Windows, vous ne devez pas définir un délai d'expiration de délai d'attente long pour . C'est vraiment une approche problématique. Que se passe-t-il si votre application est redémarrée? Comment saura-t-elle combien de temps cela fait-il dormir? Ou si le thread est redémarré?

Une meilleure approche consiste à écrire un enregistrement quelque part dans la base de données qui identifie le moment de l'importation suivante comme une date/heure. Votre service Windows peut se réveiller périodiquement (toutes les quelques minutes ou quelques heures) et voir si la date/heure actuelle est supérieure à cette valeur. Si c'est le cas, exécutez l'importation et mettez à jour la date d'exécution suivante dans la base de données à la prochaine exécution.

Si votre application est redémarrée, vous lisez simplement la valeur de la base de données et continuez comme avant.

+0

Que se passe-t-il si votre application est redémarrée? Il lit le dernier contrôle date-heure du registre, et si le delta de nowtime à registrytime est> intervalle, effectue une vérification, si

+0

@ user155077: Vous pouvez certainement faire ce que vous décrivez, mais il y a un risque associé. Je choisirais d'utiliser la base de données comme emplacement de stockage pour cette information, plutôt que le registre. Que se passerait-il s'il y avait une défaillance catastrophique du serveur et que vous deviez reconstruire la machine? Il y a de fortes chances que vous perdiez cette information dans le registre. C'est une possibilité lointaine - mais je l'ai vu arriver. Et malheureusement, le registre du système est rarement sauvegardé. – LBushkin

+0

Il est également important de mentionner que, selon l'environnement, le service Windows peut ne pas être en mesure d'écrire dans le registre. Il vaut mieux garder tout en un seul endroit, p. la base de données. –

Questions connexes