Domanda

Come si genera un evento in un momento specifico? Ad esempio, dire che voglio per generare un avviso alle 8:00 che mi informa la sua 08:00 (o un evento che mi informa del tempo corrente in un dato momento).

È stato utile?

Soluzione

Utilizza il System.Threading.Timer classe:

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

Il delegato callback si chiamerà la prossima volta è 08:00 e ogni 24 ore successive.

questa domanda SO come calcolare il prossimo 08:00 occorrenza.

Altri suggerimenti

Elaborando risposta di dtb questo è come ho implementato esso.

  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");
    }

Ha l'avviso deve essere generata dal programma? Un approccio alternativo è quello di utilizzare un pianificata (in Windows) per generare l'avviso. Potrebbe essere necessario scrivere un piccolo programma che raccoglie tutte le informazioni da file di dati della vostra applicazione principale ecc.

Ci sono un paio di vantaggi principali di utilizzare questo approccio:

  1. Non dovete scrivere alcun codice per supportare la funzione. Si fanno uso di qualcosa di integrato nel sistema operativo. L'esempio è per Windows, ma gli altri sistemi operativi hanno la stessa funzione. È possibile concentrarsi il vostro sviluppo e lo sforzo di sostegno sul proprio codice.
  2. L'applicazione principale non deve essere in esecuzione per l'attività al fuoco.
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;
            }
        }
    }

Possiamo utilizzare questa funzione per ottenere il timer in esecuzione per i tempi o modificarlo per l'esecuzione su un orario specifico: D

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top