web-dev-qa-db-fra.com

Comment générer une alerte à un instant précis en C #?

Comment puis-je générer un événement à une heure précise? Par exemple, supposons que je souhaite générer une alerte à 8h00 qui m'informe de 8h00 (ou d'un événement qui m'indique l'heure actuelle à tout moment).

27
Mobin

Utilisez le System.Threading.Timer class:

var dt = ... // next 8:00 AM from now
var timer = new Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24));

Le délégué callback sera appelé la prochaine fois à 8 heures et ensuite toutes les 24 heures.

Voir this SO question comment calculer l’occurrence suivante de 8h00.

46
dtb

En développant la réponse de dtb, voici comment je l’ai implémenté.

  private void Form1_Load(object sender, EventArgs e)
    {
        System.Threading.TimerCallback callback = new TimerCallback(ProcessTimerEvent);

        //first occurrence at
        var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0);

        if (DateTime.Now < dt)
        {
            var timer = new System.Threading.Timer(callback, null, 
                                               //other occurrences every 24 hours
                            dt - DateTime.Now, TimeSpan.FromHours(24));
        }

    }

    private void ProcessTimerEvent(object obj)
    {
        MessageBox.Show("Hi Its Time");
    }
9
Thunder

L'alerte doit-elle être générée par votre programme? Une autre approche consiste à utiliser un tâche planifiée (sous Windows) pour générer l'alerte. Vous devrez peut-être écrire un petit programme qui rassemble toutes les informations des fichiers de données de votre application principale, etc.

Cette approche présente plusieurs avantages principaux:

  1. Vous n'avez pas besoin d'écrire de code pour prendre en charge cette fonctionnalité. Vous utilisez quelque chose construit dans le système d'exploitation. L'exemple concerne Windows, mais les autres systèmes d'exploitation ont la même fonctionnalité. Vous pouvez concentrer vos efforts de développement et de support sur votre propre code.
  2. Il n'est pas nécessaire que votre application principale soit en cours d'exécution pour que la tâche soit déclenchée.
1
ChrisF
private void Run_Timer()
    {
        DateTime tday = new DateTime();
        tday = DateTime.Today;
        TimeSpan Start_Time = new TimeSpan(8,15,0);
        DateTime Starter = tday + Start_Time;
        Start_Time = new TimeSpan(20, 15, 0);
        DateTime Ender = tday + Start_Time;
        for (int i = 0; i <= 23; i++)
        {
            Start_Time = new TimeSpan(i, 15, 0);
            tday += Start_Time;
            if (((tday - DateTime.Now).TotalMilliseconds > 0) && (tday >= Starter) && (tday <= Ender))
            {
                Time_To_Look = tday;
                timer1.Interval = Convert.ToInt32((tday - DateTime.Now).TotalMilliseconds);
                timer1.Start();
                MessageBox.Show(Time_To_Look.ToString());
                break;
            }
        }
    }

Nous pouvons utiliser cette fonction pour activer le chronomètre ou le changer pour qu’il s’exécute à un moment précis: D

0
Mobin