2009-08-18 11 views

Odpowiedz

46

Użyj klasę System.Threading.Timer:

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

callback delegat będzie nazywany następnym razem to 08:00 oraz co 24 godziny później.

Zobacz this SO question jak obliczyć następne 8:00 AM wystąpienie.

+4

wiem następujący link wspomina go, ale może chcieć wyjaśnić, że to System.Threading.Timer i nie System.Windows.Forms.Timer – McAden

+1

będzie działać, jeśli mogę dostarczyć ostatni 8.00 od teraz? Czy podano liczbę ujemną? – Jaanus

+0

@Jaanus Nie Właśnie wypróbowałem to i to rzuca wyjątek. Jeśli 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; 
      } 
     } 
    } 

Możemy użyć tej funkcji dla uzyskania stoper działa na czas lub zmienić go do pracy w określonym czasie: D

+0

To oczywiste, że rozwiązanie @dtb jest lepsze. – albertein

+2

Ale jest również oczywiste, że nie wpadł na pomysł, że osoba, która zadaje pytanie, lepiej rozumie jego pytanie. Zgadzam się, dał mi format do zrobienia tego o określonej porze dnia, ale musiałem go uruchomić na niektórych warunki nie statycznie o określonej porze dnia, gdy większość pracy wykonanej w moim kodzie polega na uruchomieniu tej pętli i ustawieniu czasu do następnego zatrzymania timera. Jeśli widzisz, że nie liczba linii w tym – Mobin

1

Czy alert muszą być generowane przez program? Alternatywnym rozwiązaniem jest wygenerowanie alertu za pomocą Scheduled Task (in Windows). Być może trzeba napisać mały program, który ma żadnych informacji ze zbiorów danych głównego aplikacji itp

Istnieje kilka głównych korzyści przy użyciu tego podejścia:

  1. Nie trzeba napisać dowolny kod obsługujący tę funkcję. Korzystasz z czegoś wbudowanego w system operacyjny. Przykład dotyczy systemu Windows, ale inne systemy mają tę samą funkcję. Możesz skoncentrować swoje wysiłki w zakresie programowania i wsparcia na swoim własnym kodzie.
  2. Twoja główna aplikacja nie musi być uruchomiona, aby uruchomić zadanie.
9

Opracowanie na podstawie odpowiedzi dtb w ten sposób ją wdrożyłem.

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"); 
    } 
Powiązane problemy