2008-10-15 8 views
1

Existe-t-il des classes dans le framework .NET que je peux utiliser pour lancer un événement si le temps a rattrapé un objet DateTime spécifié?Meilleure façon de vérifier quand une date spécifiée se produit

Si ce n'est pas le cas, quelles sont les meilleures pratiques lors de la vérification? Créer un nouveau fil en vérifiant constamment? Une minuterie (Dieu nous en garde;))?

Répondre

4

Je n'irais pas avec l'approche du fil. Alors qu'un thread dormant ne consomme pas de temps CPU, il utilise le temps CPU du système/noyau. Deuxièmement, dans .NET vous ne pouvez pas ajuster la taille de la pile du Thread. Donc, même si tout ce qu'il fait est de dormir, vous êtes coincé avec un hit de 2 Mo (je crois que c'est la taille de la pile par défaut d'un nouveau thread) pour rien.

L'utilisation de System.Threading.Timer. Il utilise une file d'attente de minuterie efficace. Il peut avoir des centaines de minuteurs qui sont légers et ne s'exécutent que sur 1 thread qui est réutilisé entre tous les minuteurs (en supposant que la plupart des minuteurs ne tirent pas en même temps).

+0

Merci pour la réponse. J'espérais qu'il y aurait une sorte d'événement incroyable dont je n'avais jamais entendu parler, et je suis toujours ouvert à des façons meilleures et plus propres de faire les choses plutôt que d'effectuer un tas de déclarations conditionnelles dans le temps. :) – RodgerB

0

Lorsqu'un thread est en veille, il ne consomme aucune utilisation de l'UC. Une manière très simple serait d'avoir un thread qui dort jusqu'au DateTime. Par exemple,

DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30)); 
     new Thread(() => 
     { 
      Thread.Sleep(future - DateTime.Now); 
      //RaiseEvent(); 
     }).Start(); 

Cela signifie essentiellement, obtenir une date dans le futur (trente secondes à partir de maintenant). Ensuite, créez un fil qui dormira pour la différence des temps. Ensuite, augmentez votre événement.

Modifier: Ajout d'informations supplémentaires sur les timers. Il n'y a rien de mal avec les minuteries, mais je pense que cela pourrait être plus de travail. Vous pourriez avoir une minuterie avec un intervalle de la différence entre les temps. Cela provoquera le déclenchement de l'événement tick lorsque le temps a rattrapé l'objet date/heure. Une alternative, que je ne recommanderais pas, et je pense que vous avez raison de cela, est d'avoir une minuterie se déclencher toutes les cinq secondes et de vérifier si les temps correspondent. J'éviterais cette approche et je ferais en sorte que le thread reste en sommeil jusqu'à ce qu'il y ait du travail à faire.

+0

Est-ce qu'un thread dormant pendant longtemps sera tué proprement quand on dit à votre application de quitter (si la sortie se produit avant que le temps n'arrive)? –

+0

En utilisant un ManualResetEvent, vous pouvez simuler un Sleep très réactif lorsque vous souhaitez quitter votre application. myEvent.WaitOne (future - Datetime.now) ... puis à partir de votre thread principal lorsque vous souhaitez quitter, juste myEvent.Set ... si vous fil de temps, vous avez votre temps .. Si c'est tiré, vous sortez –

0

Une minuterie n'est probablement pas une mauvaise façon de procéder. Utilisez simplement DateTime.Now pour détecter si elle dépasse l'heure cible. N'utilisez pas == sauf si vous essayez de normaliser les heures à la minute ou l'heure ou quelque chose.

Questions connexes