2010-06-16 4 views
7

Ich möchte einen Hintergrund Arbeiter für eine WinForm erstellen, die Code auslöst, wenn Mitternacht rollt.Hintergrund Worker Check für wenn es Mitternacht ist?

Ich habe eine Vorstellung davon, wie es zu tun, aber ich bin mir ziemlich sicher, dass es nicht der beste Weg, es zu tun.

+0

Quick Hinweis ... Wenn Sie jemals eine „endlose“ Schleife so erstellt werden soll (die eine 'break', natürlich haben könnte), können Sie' while (true) {} '. '1 == 1 'wird trotzdem als' wahr 'ausgewertet. –

+0

Ist das der akzeptierte Standard? Ich war mir nie sicher, ob ich 1 == 1 – sooprise

Antwort

21

Verwenden Sie eine System.Timers.Timer und bei der Anwendung Start nur berechnen Sie den Unterschied zwischen DateTime.Now und DateTime.Today.AddDays(0). Stellen Sie dann das Intervall für diesen Betrag ein.

Ich habe tatsächlich so etwas wie dies vor kurzem:

public static class DayChangedNotifier 
{ 
    private static Timer timer; 

    static DayChangedNotifier() 
    { 
     timer = new Timer(GetSleepTime()); 
     timer.Elapsed += (o, e) => 
      { 
       OnDayChanged(DateTime.Now.DayOfWeek); 
       timer.Interval = this.GetSleepTime(); 
      }; 
     timer.Start(); 

     SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged); 
    } 

    private static void SystemEvents_TimeChanged(object sender, EventArgs e) 
    { 
     timer.Interval = GetSleepTime(); 
    } 

    private static double GetSleepTime() 
    { 
     var midnightTonight = DateTime.Today.AddDays(1); 
     var differenceInMilliseconds = (midnightTonight - DateTime.Now).TotalMilliseconds; 
     return differenceInMilliseconds; 
    } 

    private static void OnDayChanged(DayOfWeek day) 
    { 
     var handler = DayChanged; 
     if (handler != null) 
     { 
      handler(null, new DayChangedEventArgs(day)); 
     } 
    } 

    public static event EventHandler<DayChangedEventArgs> DayChanged; 
} 

UND:

public class DayChangedEventArgs : EventArgs 
{ 
    public DayChangedEventArgs(DayOfWeek day) 
    { 
     this.DayOfWeek = day; 
    } 

    public DayOfWeek DayOfWeek { get; private set; } 
} 

Verbrauch: DayChangedNotified.DayChanged += ....

+0

verwenden könnte. Also brauchte ich nicht einmal einen Hintergrundarbeiter? – sooprise

+0

@Soo: Nein. Der Timer wird nicht blockiert (stoppt den Rest Ihres Codes - http://en.wikipedia.org/wiki/Blocking_%28computing%29). Sobald das Intervall abgelaufen ist, ruft es das Tick-Ereignis auf. An dieser Stelle können Sie den Timer anhalten, das nächste Intervall berechnen und neu starten. –

+0

Nein, das System.Timers Feuer auf einem anderen Thread so alle müssen Sie vorsichtig sein, über Invoke in Ihren Event-Handler des Timers zu nennen ist. – BFree

7

Stattdessen können Sie einen Timer verwenden und das Timer-Tick-Intervall auf die Zeit zwischen Now() und Mitternacht einstellen.

0

können Sie Quartz verwenden, die zu planen. Vielleicht ist es in diesem Szenario wie eine Kanone, eine Mücke zu töten, aber das ist der einzige Zeitplan, den ich kenne und der hervorragend funktioniert.

0

nicht Polling anwenden. Richten Sie stattdessen eine Zeitgeberaufgabe ein, legen Sie sie auf Mitternacht fest und fügen Sie ein Ereignis zur Verarbeitung hinzu.

TimeSpan timeBetween = DateTime.Today.AddDays(1) - DateTime.Now; 

System.Timers.Timer t = new System.Timers.Timer(); 
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed); 
t.Interval = 1000 * timeBetween.Seconds; 
t.Start(); 
+0

Nachdem also t_Elapsed ausgelöst wurde, wird timeBetween neu berechnet? – sooprise

+0

Sie würden das Intervall in der t_Elapsed-Methode neu berechnen. – cortijon

0

Ich habe keine Ahnung, warum Polling Lösungen wurden abgestimmt auf, wenn Microsoft diese Art von Problem Jahren gelöst vor durch einen Windows-Dienst hinzugefügt Timing zu handhaben. Erstellen Sie einfach eine geplante Aufgabe, um die exe auszuführen. Kein zusätzlicher Aufwand.

0

Ich bin ein wenig verwirren, warum Sie ein WinForm benötigen, wird es um Mitternacht laufen? Wenn Sie nur einen Sortiervorgang ausführen müssen, verwenden Sie den Windows-Scheduler, um ihn um Mitternacht auszuführen. (Auf XP, aber ich glaube Win Server sollte ähnlich sein) Systemsteuerung -> Geplante Aufgaben -> Geplante Aufgabe hinzufügen -> Füllen Sie den Assistenten. Sparen Sie viel Code.

Verwandte Themen