2017-02-15 6 views
0

Ich habe folgende Datenstruktur für die Aufgabe:Berechnung der nächsten Laufzeit für die Aufgabe

Task{ 
    Start: 17:00:00 
    End: 20:00:00 
    Interval: 5 
    Days: [1, 2, 3, 6, 7] 
} 

Das ist also so etwas wie ein Zeitplan Einstellung für einige Aufgabe. Ich habe einen Windows-Dienst, der alle 5 Sekunden abhebt und einige Berechnungen durchführt, wenn es Zeit ist, die Aufgabe auszuführen. Es ist ziemlich einfach, das zu überprüfen. Zum Beispiel überprüfe ich, ob der Tag der aktuellen Zeit im Days Array ist, wenn die aktuelle Zeit zwischen Start und End usw. liegt. Also wird diese Aufgabe bei 17:05:04, 17:10:01 usw. ausgeführt (Approximation ist 5 Sekunden). So ist es die aktuelle Zeit nahe 17:00 + N*5 seconds es führt etwas Code aus. Das funktioniert richtig.

Ich kämpfe jetzt mit herauszufinden, mit einer Berechnung für die Zeit, wenn diese Aufgabe in der Zukunft ausgeführt wird. Wenn jetzt zum Beispiel Monday 16:58:30 ist, wird das nächste Mal Monday 17:05 ausgeführt. Wenn es Friday 18:00 ist, wird es unter Saturday 17:05 ausgeführt. Wenn es Monday 18:33 ist, ist der nächste Lauf Monday 18:35. Die Schwierigkeiten kommen, wenn man bedenkt, dass Anfang etwas wie Start sein: 17:03:00 und so sind Laufzeiten verschoben jetzt 17:08, 17:13 usw.

Antwort

0
/// <summary> 
/// Calculates the next run for the task. 
/// </summary> 
/// <param name="task"></param> 
/// <returns></returns> 
public static string GetNextRun(TaskBase task) 
{ 
    var now = DateTime.Now; 
    var currentDay = now.DayOfWeek == DayOfWeek.Sunday ? 7.ToString() : ((int)now.DayOfWeek).ToString(); 
    var currentTime = now.TimeOfDay; 

    var startAt = task.StartAt; 

    //If Days is empty the task will never execute. 
    if (task.Days.Length == 0) 
    { 
     return "Never"; 
    } 
    //If the current day is allowed. 
    else if (task.Days.Contains(currentDay)) 
    { 
     //If current time is allowed 
     if (currentTime >= task.StartAt && currentTime <= task.StopAt) 
     { 
      //Start from beginning and add interval till we get a time greater than current day. 
      while (startAt < currentTime) 
      { 
       startAt = startAt.Add(TimeSpan.FromMinutes(task.IntervalInMinutes)); 
      } 

      //If we are still in the allowed range return this time. 
      if (startAt >= task.StartAt && startAt <= task.StopAt) 
      { 
       return now.Date.Add(startAt).ToString(); 
      } 
     } 
     //If we are before starting point just return the first tick. 
     else if (currentTime < task.StartAt) 
     { 
      startAt = startAt.Add(TimeSpan.FromMinutes(task.IntervalInMinutes)); 

      return now.Date.Add(startAt).ToString(); 
     } 
    } 

    startAt = task.StartAt; 

    //If the current day is not allowed or the day is allowed but currentTime > task.StopAt. 
    //Add days until we get next allowed day and return the first tick. 
    while (true) 
    { 
     now = now.AddDays(1); 
     currentDay = now.DayOfWeek == DayOfWeek.Sunday ? 7.ToString() : ((int)now.DayOfWeek).ToString(); 

     if (task.Days.Contains(currentDay)) 
     { 
      startAt = startAt.Add(TimeSpan.FromMinutes(task.IntervalInMinutes)); 

      return now.Date.Add(startAt).ToString(); 
     } 
    } 
} 
Verwandte Themen