2010-03-19 3 views
4

Je travaille sur un programme qui devra supprimer un dossier (et le ré-instancier) à une certaine heure du jour, et cette heure sera donnée par l'utilisateur.C# Comment déclencher un événement à un moment précis de la journée?

L'heure sera probablement la nuit, car personne n'accède au dossier (il est en dehors des heures de travail). Y a-t-il un moyen de déclencher cet événement à cette heure précise?

Je connais les minuteries, mais existe-t-il un moyen plus simple de le faire sans minuteur qui vérifie et vérifie l'heure?

EDIT: Peut-être que je n'étais pas assez spécifique. Je veux déclencher une méthode pour faire quelque chose, sans avoir à le compiler d'abord dans un exécutable séparé. Cette méthode fait partie d'une classe plus importante qui est implémentée en tant que service Windows. Donc, ce service s'exécute en continu, mais à un certain moment de la journée, il devrait déclencher cette fonction pour supprimer le dossier.

Merci.

+1

est-ce la seule tâche que votre programme est censé accomplir? Si oui, pourquoi ne pas utiliser le planificateur de tâches? – devnull

+0

Vous ne pouvez pas configurer une minuterie pour ne cocher que dans (maintenant-quand) .TotalSeconds? Ce ne serait pas ce que vous recherchez? – ANeves

Répondre

7

Pensez prêt à l'emploi.

Pas besoin de codage sur ce type de travail - utilisez Scheduled Tasks, ils ont été dans les fenêtres pendant une longue période. Vous pouvez lancer votre programme à partir de cela.

Mise à jour: (mise à jour suivante à la question)

Si vous avez besoin de déclencher une méthode à partir d'un déjà exécutant le service, utilisez une minuterie et un test DateTime.Now contre votre temps cible.

+0

Merci, bonne idée. Aussi trouvé ce lien qui pourrait s'avérer utile pour d'autres: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/8240ca9c-a70e-4827-b5ff-c576d632862c – Andrei

2

Lorsque

  • le programme commence
  • la minuterie a été changé
  • l'événement a terminé

calculer le temps restant (en millisecondes) et définissez l'intervalle Timer.

+0

Cela nécessiterait une application à être en cours d'exécution. Il pourrait être plus approprié d'exécuter de tels problèmes de synchronisation dans un service. – citronas

+0

@citro, oui, mais cela nécessite la complexité et les autorisations de communiquer avec un service. Je ne sais pas ce que le reste de l'application fait, j'ai choisi le chemin le plus court. –

3

Utilisez le planificateur Windows. Là, vous pouvez spécifier quel fichier est exécuté quand.

2

Si vous voulez faire cela dans votre code, vous devez utiliser la classe Timer et déclencher l'événement Elapsed.

A. Calculez le temps restant avant votre première exécution.

TimeSpan day = new TimeSpan(24, 00, 00); // 24 hours in a day. 
TimeSpan now = TimeSpan.Parse(DateTime.Now.ToString("HH:mm"));  // The current time in 24 hour format 
TimeSpan activationTime = new TimeSpan(4,0,0); // 4 AM 

TimeSpan timeLeftUntilFirstRun = ((day - now) + activationTime); 
if(timeLeftUntilFirstRun.TotalHours > 24) 
    timeLeftUntilFirstRun -= new TimeSpan(24,0,0); // Deducts a day from the schedule so it will run today. 

B. Configuration l'événement de minuterie.

Timer execute = new Timer(); 
execute.Interval = timeLeftUntilFirstRun.TotalMilliseconds; 
execute.Elapsed += ElapsedEventHandler(doStuff); // Event to do your tasks. 
execute.Start(); 

C.La configuration de la méthode exécute ce que vous voulez faire.

public void doStuff(object sender, ElapsedEventArgs e) 
{ 
     // Do your stuff and recalculate the timer interval and reset the Timer. 
} 
Questions connexes