Laden...

Funktion durch Timer "zufällig" aufrufen

Erstellt von Kampfwurst vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.544 Views
K
Kampfwurst Themenstarter:in
4 Beiträge seit 2015
vor 6 Jahren
Funktion durch Timer "zufällig" aufrufen

Hallo zusammen.

Ich habe folgende Problem bei dem mir sicher jemand helfen kann.

Ich sollte eine Funktion entweder um 8:30 oder 12:00 oder 16:20 aufrufen.
Das ganze sollte zufällig sein.
D.h. z.B am Dienstag um 8:30 das nächsten mal am Donnerstag um 16:20 etc. Die Tage sind auch zufällig zu wählen.
Die Uhrzeit ist fix auf z.B 3-5 Zeiten beschränkt.

Irgendwie komme ich da nicht richtig weiter.

LG Chris

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Kampfwurst,

wo läuft die "Funktion"? In deinem Programm, in der Cloud, etc. Od. ist deine Funktion eine EXE die zu diesen Zeiten aufgerufen werden soll?

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5.

Die Tage sind auch zufällig zu wählen.

Wie ist das zu vertehen? So dass an jedem Tag (vom "Timer") zu entscheiden ist ob die Funktion heute zu den zufälligen Zeiten laufen soll od. nicht od. sollen z.B. 4 Tage der Woche zufällig gewählt werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

K
Kampfwurst Themenstarter:in
4 Beiträge seit 2015
vor 6 Jahren

Hallo gfoidl

Sorry. Das Programm würde ich gerne als Service auf einer Windows Maschine laufen lassen.
Ich muss einmal Wöchentlich entweder um 8:30 oder 12:00 oder 16:20 die Funktion aufrufen.
Der Zufall muss also bestimmen an welchem Wochentag und zu welche Uhrzeit das passieren soll.

LG Chris

T
2.224 Beiträge seit 2008
vor 6 Jahren

@Kampfwurst
Deine Anforderungen klingen aktuell ziemlich wage.
Entsprechend ist es auch schwer dir hier sinnvoll Feedback zu geben.

Ich würde mir an deiner Stelle am Montag der aktuellen Woche immer die Tage und die Zeiten per Random ermitteln lassen.
Wenn du für die aktuelle Woche noch keine Zeiten ermittelt hast, kannst du dies machen.

So könnte dein Programm per DateTime.Today.DayOfWeek prüfen ob Montag ist.
Wenn ja, dann kannst du prüfen ob du schon Zeiten gespeichert hast.
Zusätzlich musst dein Programm dann nur wissen ob es die entsprechenden "Ausführungspläne" auch durchgearbeitet hat.
Entsprechend würde ich mir dann irgendwo die Info speichern, dass mein aktueller Ausführungsplan durchgeführt wurde.
In der Aufgabenplanung kannst du dann deine Programm jede Minute oder wann auch immer du willst, durchlaufen lassen.
Du musst dann nur prüfen ob die aktuelle Zeit dann direkt bei oder nach einem Ausführungsplan liegt und deine Funktion dann aufrufen!

Hier musst du dir aber selbst ein klares Konzept machen und den Code dafür umsetzen.
Mein Ansatz dürfte dir aber schon eine grobe Richtung geben!

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

K
Kampfwurst Themenstarter:in
4 Beiträge seit 2015
vor 6 Jahren

Ich stelle mir das so vor.

Das Programm bzw. der Service startet und bestimmt per Zufall das er z.B am Dienstag um 12:00 die Funktion aufruft.

Wenn die Funktion aufgerufen wurde wird wieder Zufällig für nächste Woche ein Tag und eine Uhrzeit ausgewählt. z.B Donnerstag 8:30 etc. so soll das ewig laufen.

LG

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Kampfwurst,

dafür ein eigenen Service zu verwenden erscheint mir als Overkill. Der tut ja nichts, außer zu warten und dann -- wenn die Zeit gekommen ist -- die "Funktion" starten. Außerdem muss so die nächste Ausführung (irgendwo) gespeichert werden.

In Windows gibt es "geplante Aufgaben" / "scheduled tasks" und diese würde ich dafür verwenden. Da übernimmt das Betriebssystem das Speichern des Zeitplans, die Ausführung, usw.

Mit Schtasks kannst du die Aufgabe erstellen. Erstell die erste Aufgabe manuelle, also da wählst du den Zeitpunkt. Als Aktion wird dabei ein (Batch-) Script aufgerufen, welches folgende Schritte hat:1. die Funktion aufrufen

  1. den nächsten Zeitpunkt ermitteln (Zufallszahlen können per %random% ermittelt werden

Wenn dir Batch nicht taugt, kannst du dafür auch PowerShell od. ein simples C#-Programm verwenden (Process-Klasse ruft dann schtasks und womöglich auch deine Funktion auf)

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

286 Beiträge seit 2011
vor 6 Jahren

Unabhängig von der technischen Umsetzung (Service, Exe, Affe mit Kurbel)
Wäre eine quick'n'dirty Lösung


DateTime nächsteAusfürung;
Randomizer r;

private void Timer_Tick(object sender, EventArgs e)
{
    if (DateTime.Now == nächsteAuführung)
    {
        DoStuff();
    }
}

private void DoStuff()
{
    DoImportantStuff();

    nächsteAuführung=DateTime.Now.Date.AddDays(r.Next(1,8));
    
    switch (r.Next(1, 3))
    {
       case 1:
       {
            nächsteAuführung = nächsteAuführung.AddHours(8).AddMinutes(30);
            break;
       }
       case 2:
       {
            nächsteAuführung = nächsteAuführung.AddHours(12);
            break;
        }
        case 3:
        {
             nächsteAuführung = nächsteAuführung.AddHours(16).AddMinutes(20);
             break;
        }
    }
}

Wie gesagt, müsste noch verfeinert (der if-Vergleich ist Mist, Check auf Wochenenden, usw) werden und du musst dir überlegen wie du es umsetzen willst, aber es ist ein Ansatz.

2+2=5( (für extrem große Werte von 2)

P
441 Beiträge seit 2014
vor 6 Jahren
if (DateTime.Now == nächsteAuführung)

Halte ich für gefährlich...

Wenn es ein Service werden soll, würde ich zu Quartz.NET und Topshelf greifen. Ansonsten ist das Task Scheduler wohl die richtige Wahl.

16.835 Beiträge seit 2008
vor 6 Jahren

Hangfire, Quartz.NET... es gibt so vieles...

286 Beiträge seit 2011
vor 6 Jahren

Sagte ja der if cause ist Mist ^^ aber OP hat nach einem Timer gefragt.

2+2=5( (für extrem große Werte von 2)