49 votes

C# Timer ou Thread.Sleep

J'exécute un service Windows et j'utilise une boucle et Thread.Sleep pour répéter une tâche. Serait-il préférable d'utiliser une méthode de minuterie ?

Si oui, un exemple de code serait le bienvenu

J'utilise actuellement ce code pour répéter

int curMinute;
int lastMinute = DateTime.Now.AddMinutes(-1).Minute;

while (condition)
{
   curMinute = DateTime.Now.Minute;

   if (lastMinute < curMinute) {
         // do your once-per-minute code here
         lastMinute = curMinute;
   }

   Thread.Sleep(50000);      // sleeps for 50 seconds

   if (error condition that would break you out of this) {
       break;      // leaves looping structure
   }
}

43voto

Jon Skeet Points 692016

Un minuteur est une meilleure idée, IMO. De cette façon, si on demande à votre service de s'arrêter, il peut y répondre très rapidement et ne plus appeler le gestionnaire de tic-tac de la minuterie... si vous dormez, le gestionnaire de service devra soit attendre 50 secondes, soit tuer votre thread, ce qui n'est pas très agréable.

16 votes

Pour éviter de tuer le thread, vous pouvez utiliser un ManualResetEvent.WaitOne(50000) plutôt qu'un Thread.Sleep(). Ensuite, vous pouvez utiliser Set() pour signaler au thread qu'il doit se terminer dès qu'il le souhaite. Un timer serait probablement préférable dans ce cas.

35voto

Prashanth Points 1541
class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer(new TimerCallback(TimeCallBack),null,1000,50000);
        Console.Read();
        timer.Dispose();
    }

    public static void TimeCallBack(object o)
    {
      curMinute = DateTime.Now.Minute;
      if (lastMinute < curMinute) {
       // do your once-per-minute code here
       lastMinute = curMinute;
    }
}

Le code pourrait ressembler à quelque chose comme celui ci-dessus

6 votes

Notez que la minuterie peut être sujette à des arrêts supplémentaires du système ou à des charges élevées, ce qui n'est pas le cas de la veille. Ceci doit être pris en compte dans toute implémentation.

11voto

Il est important de comprendre que votre code va dormir pendant 50 secondes entre la fin d'une boucle et le début de la suivante...

Un timer appellera votre boucle toutes les 50 secondes, ce qui n'est pas exactement la même chose.

Les deux sont valables, mais un minuteur est probablement ce que vous recherchez ici.

7voto

Philippe Leybaert Points 62715

Attention, l'appel à Sleep() fige le service, donc si on demande au service de s'arrêter, il ne réagira pas pendant la durée de l'appel à Sleep().

4voto

Jon Norton Points 2048

Oui, l'utilisation d'une minuterie libère un fil qui passe actuellement la plupart de son temps à dormir. Un Timer se déclenchera également toutes les minutes avec plus de précision, de sorte que vous n'aurez probablement pas besoin de tenir compte des paramètres suivants lastMinute plus.

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