2009-08-18 9 views

risposta

46

utilizzare la classe System.Threading.Timer:

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

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

Vedere this SO question come calcolare l'occorrenza successiva alle 8:00.

+4

So che seguendo il link ne parla, ma potrebbe voler chiarire che questo è System.Threading.Timer e non System.Windows.Forms.Timer – McAden

+1

funzionerebbe se fornisco l'ultimo 8.00 da oggi? Quindi viene dato un numero negativo? – Jaanus

+0

@Jaanus No, l'ho appena provato e lancia un'eccezione. Se dt

0
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 usare questa funzione per ottenere il timer in esecuzione per i tempi o modificarlo per l'esecuzione su un orario specifico: D

+0

È ovvio che la soluzione di @dtb è migliore. – albertein

+2

Ma è anche ovvio che non hai avuto l'idea che una persona che pone la domanda riesca a capire meglio la sua domanda. Sono d'accordo che mi ha dato un formato per farlo in una specifica ora del giorno, ma ho dovuto farlo funzionare su le condizioni non staticamente in una certa ora del giorno una volta la maggior parte del lavoro fatto nel mio codice è per l'esecuzione di quel ciclo e impostare il tempo per il prossimo arresto del timer. Se si può vedere che non il numero di linee in quel – Mobin

1

Does l'avviso devono essere generati dal programma? Un approccio alternativo consiste nell'utilizzare un Scheduled Task (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 è necessario scrivere alcun codice per supportare la funzionalità. Fai uso di qualcosa integrato nel sistema operativo. L'esempio è per Windows, ma altri sistemi operativi hanno la stessa funzionalità. È possibile concentrare lo sviluppo e supportare lo sforzo sul proprio codice.
  2. L'applicazione principale non deve essere in esecuzione per l'attività da attivare.
9

Elaborando la risposta di dtb questo è il modo in cui l'ho implementato.

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