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
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!"
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
@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.
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
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
%random%
ermittelt werdenWenn 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!"
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)
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.
Hangfire, Quartz.NET... es gibt so vieles...
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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)