2010-05-15 9 views
2

Je suis en train de développer une application et j'ai besoin d'obtenir la date actuelle d'un serveur (elle diffère de la date de la machine). Je reçois la date du serveur et avec un simple de Split créer un nouveau DateTime:inexact. Minuteur .NET?

globalVars.fec = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, int.Parse(infoHour[0]), int.Parse(infoHour[1]), int.Parse(infoHour[2])); 

globalVars est une classe et fec est une variable statique publique pour que je puisse y accéder n'importe où dans l'application (mauvais codage Je connais...). Maintenant, j'ai besoin d'une minuterie qui vérifie si cette date est égale à certaines dates que j'ai stockées dans une liste et si elle est égale, je n'appelle qu'une fonction.

List<DateTime> fechas = new List<DateTime>(); 

Avant d'avoir à obtenir la date à partir d'un serveur que j'utilisais la date de l'ordinateur, afin de vérifier si les dates correspondent que j'utilisais ceci:

private void timerDatesMatch_Tick(object sender, EventArgs e) 
{ 
    DateTime tick = DateTime.Now; 
    foreach (DateTime dt in fechas) 
    { 
     if (dt == tick) 
     { 
      //blahblah 
     } 
    } 
} 

Maintenant, j'ai la date du serveur afin DateTime.Now ne peut pas être utilisé ici. Au lieu de cela, je l'ai créé une nouvelle minuterie avec intervalle = 1000 et sur tick J'ajoute 1 seconde à l'aide globalVars.fec:

globalVars.fec = globalVars.fec.AddSeconds(1); 

Mais l'horloge n'est pas exacte et toutes les 30 minutes de l'horloge perd environ 30 secondes .

Existe-t-il une autre façon de faire ce que j'essaie de faire? J'ai pensé utiliser threading.timer à la place mais j'ai besoin d'avoir accès à d'autres threads et fonctions non statiques.

+1

J'ai en fait le temps serveur, j'ai juste besoin de l'application pour utiliser cette heure du serveur et non celui de l'ordinateur – Ivan

+0

C# n'a pas de minuteries. Le .NET Framework fait. –

Répondre

8

Enregistrez la différence entre l'heure et l'heure locale du serveur. Calculez le temps des serveurs quand vous en avez besoin en utilisant cette différence.

+0

N'a pas pensé à cela, je pensais juste sur des solutions difficiles quand la vraie solution était assez facile. Merci! – Ivan

+0

Oui, mais cela doit être ré-étalonné de temps en temps. –

+0

Pourquoi?Je stocke juste la différence entre l'heure du serveur et l'heure locale dans un TimeSpan et quand j'ai besoin de vérifier si les dates correspondent je fais juste le DateTime.Now.Add (timespan_diff); – Ivan

6

Si vous créez un atimer avec un intervalle de 1000ms, il sera appelé au plus tôt 1000ms. Ainsi, vous pouvez pratiquement garantir qu'il sera appelé dans plus de 1000ms, ce qui signifie que vous "perdrez" du temps en ajoutant 1s sur cette coche de minuterie - Cela va accumuler l'erreur à chaque tick. Une meilleure approche consiste à enregistrer une heure de début et à utiliser l'heure actuelle pour déterminer le décalage actuel par rapport à cette heure de début connue, afin de ne pas accumuler d'erreur dans votre temps. (Il y aura toujours une erreur, mais vous ne perdrez pas le contact avec le temps réel au fil du temps)

Différents temporisateurs (Forms.Timer, Thread.Timer, etc.) donneront des précisions différentes - Forms.Timer est particulièrement pauvre pour l'exactitude.

Vous pouvez également utiliser un temps de haute performance pour suivre le temps mieux - voir here, par exemple.