2016-12-13 17 views
0

私は非常にユニークな問題に直面しています。私は毎分メソッドをトリガーするSystem.Timers.Timerを使用しています。徐々に、私は時間間隔が一定ではないことを知りに来た。System.Timers.Timerは徐々に間隔を広げていますか?

問題をテストして確認するために、毎分機能を実行するタイマーを実行するだけです。そして出力は衝撃的でした。タイマー間隔秒は一定ではありません。彼らは変化しているので、問題が生じています。

12/13/2016 3:39:26 PM 
12/13/2016 3:40:25 PM 
12/13/2016 3:41:25 PM 
12/13/2016 3:42:25 PM 
12/13/2016 3:43:25 PM 
12/13/2016 3:44:26 PM 
12/13/2016 3:45:26 PM 
12/13/2016 3:46:26 PM 
12/13/2016 3:47:26 PM 
12/13/2016 3:48:26 PM 
12/13/2016 3:49:26 PM 
12/13/2016 3:50:26 PM 
12/13/2016 3:51:26 PM 

間隔が徐々に増えています。この問題は、日数が過ぎると発生します。だから、問題は私が分以内に処理しなければならないように作成され、日付が変更されます。でSystem.Timers.Timerその正確ではない

System.Timers.Timer timer = new System.Timers.Timer(); 
timer.Interval = 60000; 
timer.Elapsed += timer_Elapsed; 
timer.Start(); 
+2

どのように徐々に増加していますか?私は「59.?」と「60.?」の間に間隔があり、明らかな傾向は見られません。 WindowsはリアルタイムOSではないため、タイマー間隔は決して正確ではありません。 – InBetween

答えて

0

私はその問題を解決することができました。解決策は簡単です。

グローバルレベルで2つのチェックを設定します。

static bool _IsDirty = false, _TimerChecked = true; 

はその後DataSynchronizerはその後、実装は

private Task AdwordsPullDataSynchronizer(System.Timers.Timer timer) 
{ 

    if (!_TimerChecked) 
    { 
      _IsDirty = false; 
      timer.Stop(); 
      var interval = Convert.ToDouble(Math.Abs(DateTime.Now.Second - 60)); 
      timer.Interval = (interval + 2) * 1000; 
      timer.Start(); 
      _TimerChecked = true; 
    } 

    if (DateTime.Now.Second > 10) 
    { 
     _IsDirty = true; 
     _TimerChecked = false; 
    } 


    //Place your interval logic here 

    if (_IsDirty) 
    { 
     timer.Stop(); 
     var interval = Convert.ToDouble(Math.Abs(DateTime.Now.Second - 60)); 
     timer.Interval = (interval + 2) * 1000; 
     timer.Start(); 
    } 

    return Task.FromResult(0); 
} 

私が実装した側のロジック保存かなり明確となる可能性がデリゲートメソッドで聞かせてElapsedEventHandler内部のロジックを処理します。

コードは何ですか。間隔秒数が10より大きい場合はreset the timerになり、次の間隔はElapsedEvent 2nd secondに設定されます。その後、fixed the intervalをすべてElapsedEvent 2nd secondにリセットします。

1

コードは単純です。備考欄hereを確認してください。

+0

それは問題です、今私にとっては、この問題をどのように処理するかということがさらに懸念されています –

+0

私はこれを自分で実装していませんが、メディアの高精度タイマーを使いたいかもしれません。ここではC#でラッパー実装を見つけることができます:http://web.archive.org/web/20110910100053/http://www.indigo79.net/archives/27 – Nick

関連する問題