web-dev-qa-db-fra.com

Quel est le meilleur moyen d'implémenter une "minuterie"?

Duplicate possible:
Comment ajouter une minuterie à une application console C #

Quel est le meilleur moyen d'implémenter une minuterie? Un exemple de code serait génial! Pour cette question, le "meilleur" est défini comme le plus fiable (le moins de ratés) et le plus précis. Si je spécifie un intervalle de 15 secondes, je souhaite que la méthode cible soit invoquée toutes les 15 secondes et non toutes les 10 à 20 secondes. D'autre part, je n'ai pas besoin d'une précision à la nanoseconde. Dans cet exemple, il serait acceptable que la méthode se déclenche toutes les 14,51 à 15,49 secondes.

172
Robert

Utilisez la classe Timer .

public static void Main()
{
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 5000;
    aTimer.Enabled = true;

    Console.WriteLine("Press \'q\' to quit the sample.");
    while(Console.Read() != 'q');
}

 // Specify what you want to happen when the Elapsed event is raised.
 private static void OnTimedEvent(object source, ElapsedEventArgs e)
 {
     Console.WriteLine("Hello World!");
 }

L'événement Elapsed sera généré toutes les X millisecondes spécifiées par la propriété Interval sur l'objet Timer. Elle appellera la méthode Event Handler que vous spécifiez. Dans l'exemple ci-dessus, il s'agit de OnTimedEvent.

294
Dave Zych

En utilisant la classe System.Windows.Forms.Timer, vous pouvez obtenir ce dont vous avez besoin.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();


t.Interval = 15000; // specify interval time as you want
t.Tick += new EventHandler(timer_Tick);
t.Start();

void timer_Tick(object sender, EventArgs e)
{
      //Call method
}

En utilisant la méthode stop (), vous pouvez arrêter le chronomètre.

t.Stop();
38
Jignesh Thakker

Il n'est pas clair quel type d'application vous allez développer (desktop, web, console ...)

La réponse générale, si vous développez l'application Windows.Forms, est l'utilisation de

System.Windows.Forms.Timer classe. L'avantage de ceci est qu'il fonctionne sur le thread UI, il est donc simple de le définir, de s'abonner à son événement Tick et d'exécuter votre code toutes les 15 secondes.

Si vous faites autre chose que Windows Forms (ce n'est pas clair dans la question), vous pouvez choisir System.Timers.Timer , mais ceci s'exécute sur autre thread, donc si vous allez agir sur certains éléments de l'interface utilisateur à partir de l'événement its Elapsed , vous devez le gérer. avec "invoquer" l'accès.

24
Tigran

Référencez ServiceBase à votre classe et mettez le code ci-dessous dans l'événement OnStart:

Constants.TimeIntervalValue = 1 (heure) .. Idéalement, vous devez définir cette valeur dans le fichier de configuration.

StartSendingMails = nom de la fonction que vous souhaitez exécuter dans l'application.

 protected override void OnStart(string[] args)
        {
            // It tells in what interval the service will run each time.
            Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000;
            base.OnStart(args);
            TimerCallback timerDelegate = new TimerCallback(StartSendingMails);
            serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval));
        }
2
A Developer