2017-07-10 10 views
0

を作成しました。これは毎日12P.m.で実行されます。しかし、私はなぜそれが中夜に呼び出されるいくつかの問題のために12 A.M.毎日特定の時刻にWindowsサービスを呼び出す

はここ
private Timer _timer = null; 
private DateTime _scheduleTime; 
private static int FixHours = 12;//12 P.M. 

protected override void OnStart(string[] args) 
{ 
    try 
    { 
     _timer = new Timer(); 
     //check for time, if service started in morning before fix hours then service call should be on fixhours else next day 
     if (DateTime.Now.TimeOfDay.Hours < FixHours) 
     { 
      var staticDateTime = DateTime.Now.Date; 
      staticDateTime = staticDateTime.AddHours(FixHours).AddMinutes(0).AddSeconds(0); 
      _timer.Interval = staticDateTime.Subtract(DateTime.Now).TotalMilliseconds; 
      Log.Debug("Schedule Time:- " + staticDateTime.ToString()); 
     } 
     else 
     { 
      // Schedule to run once a day at 12 P.M. 
      _scheduleTime = DateTime.Today.AddDays(1).AddHours(FixHours); 
      _timer.Interval = _scheduleTime.Subtract(DateTime.Now).TotalMilliseconds; 
      Log.Debug("Schedule Time:- " + _scheduleTime.ToString()); 
      Log.Debug("Total Milisecond:- " + _timer.Interval.ToString()); 
     } 
     _timer.Elapsed += Timer_Elapsed; 
     _timer.Enabled = true; 
    } 
    catch (Exception ex) 
    { 
     Log.Error(ex); 
    } 
} 
private async void Timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Log.Debug("Service Called:-" + e.SignalTime.ToString());    
    // 1. If tick for the first time, reset next run to every 24 hours 
    double totalInterval = FixHours * 60 * 60 * 1000; 
    if (_timer.Interval != totalInterval) 
     _timer.Interval = totalInterval; 
} 

私は12 PMに修正時間を宣言:

は、ここに私のコードです。 OnStartメソッドでは、いつサービスを呼び出すかを識別するためのコードを記述しています。 12 PM 12 PMで明日呼び出す必要があります。12 PMのサービスを開始する前にサービスを開始すると、12 PMの後に開始されます。

しかし、いつか真夜中に電話しています。私はどこが間違っているのか分かりません。

2017-07-05 11:10:42,096 [4] DEBUG Schedule Time:- 7/5/2017 12:00:00 PM 
2017-07-05 12:00:00,326 [6] DEBUG Service Called:-7/5/2017 12:00:00 PM 
2017-07-05 15:47:18,097 [4] DEBUG Schedule Time:- 7/6/2017 12:00:00 PM 
2017-07-05 15:47:18,113 [4] DEBUG Total Milisecond:- 72761917.9899 
2017-07-06 12:00:03,981 [6] DEBUG Service Called:-7/6/2017 12:00:03 PM 
2017-07-07 00:00:05,745 [1441] DEBUG Service Called:-7/7/2017 12:00:05 AM 
2017-07-07 12:00:07,873 [1860] DEBUG Service Called:-7/7/2017 12:00:07 PM 
2017-07-08 00:00:09,906 [422] DEBUG Service Called:-7/8/2017 12:00:09 AM 
2017-07-08 12:00:12,031 [1019] DEBUG Service Called:-7/8/2017 12:00:12 PM 
2017-07-09 00:00:14,299 [2282] DEBUG Service Called:-7/9/2017 12:00:14 AM 
2017-07-09 12:00:16,334 [843] DEBUG Service Called:-7/9/2017 12:00:16 PM 
2017-07-10 00:00:18,279 [2972] DEBUG Service Called:-7/10/2017 12:00:18 AM 
+0

Windowsと時間がどうやって得られないかについては、[Quartz.NET FAQ](https://www.quartz-scheduler.net/documentation/faq.html)をご覧ください。一緒に。システムクロックが更新された場合、タイマーは間違っています。 DST?まさにあなたのコードは、他のタスクに応じて、要求された時間の後に実行されます。 – HABO

答えて

1

あなたは次の特定の時間にオールウェイズアクションをスケジュールしたい場合は、以下のようにそれを解決することができます:

は、これが私のログです。

var now = DateTime.Now; 
var scheduledTime = new DateTime(now.Year, now.Month, now.Day, FixHours, 0, 0); 
if (scheduledTime < now) 
    scheduledTime = scheduledTime.AddDays(1); 

var timeout = scheduledTime - now; 

var timer = new Timer(timeout.TotalMilliseconds); 
timer.Enabled = true; 
timer.Elapsed += Timer_Elapsed; 
+0

お返事ありがとうございます。私はこれを確認します。 –

関連する問題