2010-12-05 23 views
1

Je souhaite implémenter une méthode rappelant une méthode à un moment précis. Nous pouvons avoir plus qu'une méthode qui peut être appelée en même temps.Rappel avec un temps

public void CallmeBack(DateTime time, Action callback) 
    { 

    } 

Quelle est la meilleure implémentation en C#? Ma solution rapide et sale était de créer un dictionnaire Dictionary<DateTime, List<Action>> et de faire une minuterie chaque chaque (minute/seconde) et vérifier l'heure (DateTime.Now) et une heure actuelle dans le mode de test.

La solution doit être "sûre" si l'heure actuelle de la machine a changé. Ainsi, une solution simple comme cela pourrait ne pas fonctionner:

 Timer timer = new Timer((param) => {callback.Invoke();}, null, 
      (long)(time - DateTime.Now).TotalMilliseconds, Timeout.Infinite); 

Edit: cas typique où simple minuterie ne fonctionne pas est l'heure d'été et réglage manuel de l'heure/date. De plus, je veux juste que le rappel soit exécuté une fois pas plusieurs fois.

+0

Je sais qu'il est tard, mais avez-vous résolu cela? Quelle précision avez-vous besoin que ce soit ... –

Répondre

2

Ce que vous cherchez est une bibliothèque cron. Il y en a beaucoup là-bas. Certains ont beaucoup de fonctionnalités et sont un peu lourds. Voici un article sur les emplois cron et une bibliothèque que j'ai utilisé dans le code de production.

http://blog.bobcravens.com/2009/10/an-event-based-cron-scheduled-job-in-c/

Hope qui aide à démarrer.

Bob

+0

Il suffit de relire votre message. Vérifiez la bibliothèque et faites attention à votre dernière exigence. Cela fait longtemps et j'ai oublié les internes. – rcravens

+0

En fait, il semble qu'il ne considère pas le changement d'heure. Je regarde de plus près le code pour le vérifier. mais au moins, vous m'avez commencé;) – Zied

1

Quelques alternatives que vous pouvez envisager:

  • Vous pouvez utiliser un planificateur de tâches tels que: http://taskscheduler.codeplex.com/

  • Vous pouvez coller avec une minuterie et écoutez les changements d'heure en utilisant: SystemEvents.TimeChanged. Cet événement est déclenché par les changements d'heure de l'utilisateur. Je suppose que vous pouvez gérer des changements d'heure prévisibles (l'heure d'été, etc.) lors du réglage de la minuterie en premier lieu. Je ne suis pas sûr des changements liés au NTP - vous devriez étudier cela plus avant.

+0

J'ai besoin d'exécuter des méthodes ne pas traiter donc le planificateur de tâches ne peut pas résoudre simplement mes problèmes. – Zied

+0

Pour l'événement, je peux éventuellement le traiter. – Zied