2017-01-06 13 views
-1

私はジョブスケジューリングプログラムを持っていますが、タイミングをより正確に変更しています。次のDateTime間隔を、 "now"の後、ベースDateTimeに基づいて取得します。

起動時間に基づいて、所定のx分間隔で実行する必要があります。私の問題へ

簡単ですが、非効率的な解決策は次のようになります。

var scheduledOn = new DateTime(2017, 01, 3, 9, 5, 0); 
var minutesBetweenJob = 5; 

while (scheduledOn < DateTime.Now) 
{ 
    scheduledOn = scheduledOn + TimeSpan.FromMinutes(minutesBetweenJob); 
} 
Console.WriteLine("Correct Answer: " + scheduledOn); 

しかし、ジョブが実行のためにされていない場合、年言うことができます。非常に効率的ではありませんが、それが正しくなる前に5分の反復を実行する必要があります。

私はいくつかの方法を試しましたが、浮動小数点エラーのために非常に不正確になってしまいました。

答えて

1

これは私自身の問題に対する解決策でした。それは私の以前の試みよりも少なくとも10〜20倍高速で実行されているようで、正確にはミリオスまでです。

ナノ秒を扱うときに浮動小数点エラーが発生することがわかったので、datetimeを数秒または数ミリ秒にトリミングして問題を解決しました。

/// <summary> 
/// This function calculates the next datetime interval for a given datetime, based on a scheduled time. 
/// Eg. Job is scheduled to run at 15:00 and every 5 minutes, the next scheduled time will be 15.05, then 15.10 and so forth. 
/// The calculated time will always be after the "afterDateTime". 
/// </summary> 
/// <param name="baseDatetime">The time that scheduled time is based on</param> 
/// <param name="interval">The interval in minutes</param> 
/// <param name="afterDateTime">Usually datetime now, but the date it should be "after".</param> 
/// <param name="tickPrecision">[Optional (Default = TimeSpan.TicksPerSecond)] Determine the tick precision, the lowest possible value is TicksPerMillisecond</param> 
/// <returns>The next scheduled time</returns> 
public static DateTime CalculateNextScheduledTime(DateTime baseDatetime, int interval, DateTime afterDateTime, long tickPrecision = TimeSpan.TicksPerSecond) 
{ 
    // Reset afterDateTime to tick precision. 
    afterDateTime = new DateTime(((long)afterDateTime.Ticks/tickPrecision) * tickPrecision); 
    // (Subtract Difference in modulus time intervals between aftertime base time) + the interval. 
    return afterDateTime - TimeSpan.FromMinutes((afterDateTime - baseDatetime).TotalMinutes % interval) + TimeSpan.FromMinutes(interval); 
} 
関連する問題