3

システムクロック(00:01:00、00:02:00、00:03:00など)と同期してタイマーを毎分実行しようとしています。次のコードは安定したタイマーを生成しますか?実行してみました。タイマーは毎分正確に実行されます。しかし、問題は、たとえば、数か月後にそれがさまよい始めるかどうかです。

private System.Timers.Timer timer;

public frmMain()
{
            timer = new System.Timers.Timer();
            timer.AutoReset = false;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Interval = GetInterval();
            timer.Start();
}

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
            //Do processing

            timer.Interval = GetInterval();
            timer.Start();

}
private double GetInterval()
{
            DateTime now = DateTime.Now;
            return ((60 - now.Second) * 1000 - now.Millisecond);
}
4

4 に答える 4

4

そうではありません。

DateTime.Nowシステムクロックを基準タイマーとして使用するため、タイマーは常に同期を維持し、システムクロックの分解能の数ミリ秒をモジュラスします。

于 2012-06-13T11:46:48.703 に答える
0

タイマーが刻むたびに、次の正確な分までの長さを決定し、それに応じて間隔を設定します。理論的には、それは実際には非常に独創的です。なぜなら、私はタイマー自体がさまよってしまうからです。確実に知る唯一の方法は、もちろんテストすることです。UIが60秒以上フリーズしない限り(安全に再生するには50秒程度)、問題は発生しません。ラップトップは、しばらく放置したり、蓋を閉めたりすると、グリッチが発生することがよくあることに注意してください。

何をしようとしているのかにもよりますが、システム時刻だけを使って、分が変わるたびにイベントを送信してみませんか?

于 2012-06-13T11:47:36.667 に答える
0

全体像は問題ないGetIntervalように見え、常に正の値を返します。いくつかの注意事項しかありません。

  1. スタンバイ/再開が発生した場合、ラウンド以外の時間に 1 回の実行が発生する可能性があります
  2. timer_Elapsed が完了するまでに 1 分以上かかる場合は、ビートを逃します
  3. システムが過負荷になり、timer_Elapsed が 40/50 秒の遅延でスケジュールされていて、timer_Elapsed に 2 秒以上かかる60 - delay場合は、ビートを逃します。
于 2012-06-13T11:58:59.883 に答える
0

コードがドリフトすることはありませんが、Timer コールバックが要求された間隔で発生することはめったにないため、(必然的に) ジッターが発生します。

このコードで見られる唯一の潜在的なThreadPool問題は、タイマー コールバックがキューから取り出されず、分間隔内に実行されず、分がスキップされるような負荷がかかっていた場合です。

これはややありそうにないように思えますが、完全に可能性の範囲を超えているわけではありません。

于 2012-06-13T11:54:18.027 に答える