2010-09-27 9 views
2

Pour un projet de travail, j'entreprends une tâche qui me permettra de créer un service Windows C# .NET qui fonctionnera 24/7. Le programme va essentiellement simplement déplacer des fichiers (basés sur un chemin donné et une regex) entre différents emplacements - de/vers HTTP, les chemins réseau et FTP. L'administrateur planifie ces travaux via une page d'administration dans ASP.NET, où tous les travaux seront stockés dans une base de données. Apparemment, la tâche la plus difficile consiste à planifier ces tâches. Il est très simple de planifier des tâches à un moment donné, mais elles doivent également être suffisamment robustes pour permettre l'exécution des tâches tous les jours, tous les jours de la semaine et tous les jours. du mois, ou même toutes les quelques secondes/minutes. J'ai conclu que la façon la plus simple de stocker ces informations de planification serait d'utiliser la syntaxe cron (http://adminschoice.com/crontab-quick-reference) dans la base de données. L'application a une minuterie pour vérifier la base de données pour les changements toutes les 10 minutes, mais le principal problème que j'ai est de récupérer les tâches à effectuer - Je suppose qu'une option serait de simplement tout récupérer toutes les 10 minutes, et vérifiez chaque rangée individuelle pour voir si elles doivent être effectuées. Mais je pense que c'est un moyen très inefficace et techniquement paresseux - comment vous y prendrez-vous?Application 'tâches planifiées' basée sur base de données en C# - besoin d'un conseil pour la syntaxe

Je sais que tâches planifiées de Windows serait une façon beaucoup plus facile, mais il semble que mon patron ne veut pas.

Merci d'avance à tous ceux qui peuvent offrir quelques conseils/conseils.

+3

Obtenez un nouveau patron qui comprend que l'on utilise les bons outils pour le bon travail? – Oded

+0

Avez-vous envisagé d'utiliser Quartz.Net pour programmer ceci? Cela semble être un choix approprié (http://quartznet.sourceforge.net) –

Répondre

0

Si le nombre de tâches que vous devez garder une trace de n'est pas énorme, vous pourriez maintenir une file d'attente prioritaire de toutes les tâches en mémoire. Les nœuds contiendraient la clé d'enregistrement (à partir de la base de données) et la prochaine date/heure de mise à jour calculée. Lorsque le programme démarre, lisez chaque enregistrement de la base de données et construisez votre file d'attente prioritaire. Une fois la file d'attente construite, regardez la date du premier élément et réglez une minuterie pour qu'elle se réveille à ce moment-là. Lorsque la minuterie se réveille, exécutez toutes les tâches qui sont actuellement dues, reprogrammez-les pour la date/heure de mise à jour suivante, recherchez l'élément suivant qui doit être mis à jour et définissez une minuterie pour se réveiller à ce moment.

Pour gérer les modifications, vous pouvez avoir l'application Web qui modifie les choses à informer votre service aussi. Vous devez annuler la minuterie existante et la reprogrammer, mais vous n'avez pas besoin de lire toute la base de données, sauf au démarrage.

Cela dit, je suis d'accord avec @Oded: convaincre votre patron d'utiliser Windows Tâches planifiées. S'il n'aime pas cette interface, vous pouvez demander à votre application Web (ou à un service avec lequel l'application Web communique) de parler à l'API du planificateur de tâches Windows. Codeplex a un wrapper: http://taskscheduler.codeplex.com/

0

Jetez un oeil à Quartz.NET - à peu près fait exactement ce que vous voulez. Vous pouvez le programmer en utilisant Cron expressions aussi.

Si vous stockez les informations suffisamment sur chaque emploi dans la base de données, vous serez en mesure de créer un emploi à chaque fois que votre service commence. Vous pouvez interroger périodiquement les modifications et mettre à jour les règles du travail. L'héberger dans un service Windows est un bon moyen de le faire - vous permettre de surveiller son fonctionnement et fournit des mécanismes standard pour le redémarrer s'il tombe (net start xxx), etc. Bien mieux que les tâches planifiées.