84 votes

Comment planifier un service Windows C # pour effectuer une tâche quotidiennement?

J'ai un service écrit en C # (.NET 1.1) et je souhaite qu'il effectue des opérations de nettoyage à minuit tous les soirs. Je dois garder tout le code contenu dans le service, alors quel est le moyen le plus simple d'y parvenir? Utilisation de Thread.Sleep() et vérification du temps écoulé?

86voto

M4N Points 48758

Je n'utiliserais pas Thread.Sleep (). Utilisez une tâche planifiée (comme d'autres l'ont mentionné) ou configurez une minuterie dans votre service, qui se déclenche périodiquement (toutes les 10 minutes, par exemple) et vérifiez si la date a changé depuis la dernière exécution:

 private Timer _timer;
private DateTime _lastRun = DateTime.Now.AddDays(-1);

protected override void OnStart(string[] args)
{
    _timer = new Timer(10 * 60 * 1000); // every 10 minutes
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    _timer.Start();
    //...
}


private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // ignore the time, just compare the date
    if (_lastRun.Date < DateTime.Now.Date)
    {
        // stop the timer while we are running the cleanup task
        _timer.Stop();
        //
        // do cleanup stuff
        //
        _lastRun = DateTime.Now;
        _timer.Start();
    }
}
 

73voto

jeremcc Points 3720

Découvrez Quartz.NET . Vous pouvez l'utiliser dans un service Windows. Il vous permet d'exécuter un travail en fonction d'un calendrier configuré et prend même en charge une syntaxe simple "travail cron". J'ai eu beaucoup de succès avec ça.

Voici un exemple rapide de son utilisation:

 // Instantiate the Quartz.NET scheduler
var schedulerFactory = new StdSchedulerFactory();
var scheduler = schedulerFactory.GetScheduler();

// Instantiate the JobDetail object passing in the type of your
// custom job class. Your class merely needs to implement a simple
// interface with a single method called "Execute".
var job = new JobDetail("job1", "group1", typeof(MyJobClass));

// Instantiate a trigger using the basic cron syntax.
// This tells it to run at 1AM every Monday - Friday.
var trigger = new CronTrigger(
    "trigger1", "group1", "job1", "group1", "0 0 1 ? * MON-FRI");

// Add the job to the scheduler
scheduler.AddJob(job, true);
scheduler.ScheduleJob(trigger);
 

21voto

Marc Gravell Points 482669

Une tâche quotidienne? Cela ressemble à une tâche planifiée (panneau de configuration) - aucun service n'est nécessaire ici.

15voto

Ian Jacobs Points 4165

Faut-il que ce soit un service réel? Pouvez-vous simplement utiliser les tâches planifiées intégrées dans le panneau de configuration de Windows.

3voto

CubanX Points 3603

La façon que je peux faire c'est avec une minuterie.

Exécuter un serveur minuterie, vérifier les Heures/Minutes toutes les 60 secondes.

Si c'est la bonne Heure/Minute, puis exécutez votre processus.

En fait, j'ai ce prélevée dans une base de classe I appel OnceADayRunner.

Permettez-moi de nettoyer un peu le code et je vais le poster ici.

	private void OnceADayRunnerTimer_Elapsed(object sender, ElapsedEventArgs e)
	{
		using (NDC.Push(GetType().Name))
		{
			try
			{
				log.DebugFormat("Checking if it's time to process at: {0}", e.SignalTime);
				log.DebugFormat("IsTestMode: {0}", IsTestMode);

				if ((e.SignalTime.Minute == MinuteToCheck && e.SignalTime.Hour == HourToCheck) || IsTestMode)
				{
					log.InfoFormat("Processing at: Hour = {0} - Minute = {1}", e.SignalTime.Hour, e.SignalTime.Minute);
					OnceADayTimer.Enabled = false;
					OnceADayMethod();
					OnceADayTimer.Enabled = true;

					IsTestMode = false;
				}
				else
				{
					log.DebugFormat("Not correct time at: Hour = {0} - Minute = {1}", e.SignalTime.Hour, e.SignalTime.Minute);
				}
			}
			catch (Exception ex)
			{
				OnceADayTimer.Enabled = true;
				log.Error(ex.ToString());
			}

			OnceADayTimer.Start();
		}
	}

Le bœuf de la méthode est dans l'e.SignalTime.Minutes/Heures.

Il y a des crochets pour les tests, etc ... mais c'est ce que votre temps écoulé pourrait ressembler à tout faire fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X