[C#] Funktion täglich um bestimmte Zeit ausführen

Klein0r

Erfahrenes Mitglied
Hallo zusammen,

ich suche nach einer Lösung, eine bestimmte Funkion täglich um eine definierte Uhrzeit auszuführen.

Mit einem Timer könnte man ja das 24 Stunden-Problem lösen:
C#:
Timer t = new Timer();
t.Tick += new EventHandler(t_Tick);
t.Interval = 1000 * 60 * 60 * 24; // Every day
t.Start();

void t_Tick(object sender, EventArgs e)
{
    // Do it
}

Aber wie führe ich die Start-Methode um eine bestimmte Zeit aus?
Bin für jeden Ratschlag dankbar!

Gruß

Folgendes wäre natürlich auch ein Ansatz - wenn auch etwas umständlich (UNGETESTET):

C#:
public class TimerTest
{
    private Timer t = null;

    public TimerTest()
    {
        t = new Timer();
        t.Tick += new EventHandler(t_Tick);

        // Calculate first start
        DateTime startTime = DateTime.ParseExact("2010-07-01 23:00", "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
        t.Interval = (startTime - DateTime.Now).Milliseconds;

        t.Start();
    }

    void t_Tick(object sender, EventArgs e)
    {
        // Set the next interval
        t.Interval = 1000 * 60 * 60 * 24; // Every day

        // Do it
    }
}

Sowas suche ich in kurz ;)

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hmm, das setzt voraus, dass dein Programm 24/7/52 läuft. Je nachdem wo das Programm dann läuft, musst du halt schauen, dass das nicht so viel Leistung frisst.
Auch wenn es eigtl. mehr OT ist, würde ich die entsprechende Operation als dll oder exe compilen und mit einem Task ausführen. Der ist auch etwas "wiederstandsfähiger", wenns mal zu einem critical Systemreboot kommt. Ein weiterer Vorteil ist, dass du nur soviel RAM und CPU-Zeit benötigst wie die eigentliche Operation auch tatsächlich braucht in der Zeit in der sie läuft.

Ich hab selbst mal ein solches Problem gehabt, mit einem kleinen Konsolentool, dass das Filesystem aufräumt und eben überlegt wie ich das Programm immer wieder zu einer bestimmten Uhrzeit jeden Tag starte. Ich habs dann einfach effizient und unkompliziert mit dem Taskplaner gemacht. Aber das nur mal am Rande.

Ich habe auch schonmal mit dem Timer herumgespielt und festgestellt, dass selbst ein ausgelagerter Timer-Thread auf nicht so ganz leistungsstarken Systemen wie einem Single-Core einen immensen Performanceeinbruch verursacht - und da hab ich nur die Zeit ausgeben lassen und keine "Stopp-Uhr" gebaut. Aber prinzipiell kann man das schon so machen, dass man einen Timer in einen Thread schiebt, der dann wiederrum immer in einem Intevall die Operation ausführt. Beispiele fürs Threading gibbet im Netz zu Hauf.
 
Danke für die vielen Antworten - ich hatte einfach gehofft, dass das Framework für solche Fälle schon eine Lösung parat hat - aber muss man doch anscheinend selbst errechnen.

Da das Programm später auf Enterprise-System mit mindestens 4 Kernen und 16 GB RAM laufen wird, steht Ressourcen sparen nicht unbedingt im Vordergrund.

Ziel ist es, einmal am Tag eine neue Konfigurationsdatei via WCF-Webservice anzufordern, die sich eventuell geändert hat. Für so eine kleine Aufgabe im Programm möchte ich ungern einen extra Prozess starten. Über das Threading-Thema denke ich natürlich auch schon nach, da so ein Webservice-Zugriff natürlich den Programmablauf verzögern kann.

Quartz kenne ich noch garnicht - werde ich mir mal ansehen! Vielen Dank dafür ;)
Dazu müsste ich mir aber auch nochmal das Lizenzmodell ansehen.

Weitere Antworten / Vorschläge sind immer willkommen!

Gruß
 
hmm, also unter Vista hab ich sowas noch nicht probiert, aber unter älteren Windows-Versionen gab es doch da einen Task-Scheduler oder sowas, dort konnte man einstellen, dass ein bestimmtes Programm in regelmäßigen Abständen, z.B. einmal am Tag, ausgeführt werden sollte.
Wenn es das noch gibt bräuchtest du den Workaround mit .NET nicht, sondern nur ein einfaches Progamm dass die eigentliche Aufgabe macht und sich nicht ums Scheduling kümmern muss.

gruß
Ringelsocke
 
Alos, ich würde mir folgenden Artikel von codeproject.com Mal anschauen:
http://www.codeproject.com/KB/dotnet/ABTransClockArticle.aspx

Hab den nur mal angelesen, hört sicher aber meiner Meinuing nach ganz gut an. Der Ansatz geht wohl auch über nen eigenen Thread. Das ist meiner Meinung nach der einzig vernünftige Weg. Wenn man wegen eines einzelenen Threads der solch simple Aufgaben erledigt, ernsthafte Performanceprobleme bekommt, dann hat man definitiv etwas falsch gemacht.
 

Neue Beiträge

Zurück