7

イベント間に「ドリフト」がないことを保証できる C# で利用可能な .NET タイマーはありますか? つまり、タイマーを X 秒ごとにオフにするように設定した場合、何日も操作した後でもドリフトしないということです。

そうでない場合、これを行うために C# でタイマー関数をラップするよく知られたコード例はありますか?

4

2 に答える 2

16

あなたはすでに何かを試したと思います、そしてそれは漂っています。

時間(5,10,15,20 ..)から5秒ごとに何かを起動したい場合は、タイマーを1回起動するように設定してから、コールバックでタイマーをリセットしてDateTime.Now+で起動することができます。次の5秒間隔までの秒数。

これにより、時計が正しい限り、ドリフトを防ぐことができます。

このようなもの

System.Timers.Timer timer = new Timer();

void Init()
{
    timer.Elapsed += timer_Elapsed;
    int wait = 5 - (DateTime.Now.Second % 5);
    timer.Interval = wait*1000;
    timer.Start();
}


void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    timer.Stop();
    int wait = DateTime.Now.Second % 5;
    timer.Interval = wait * 1000;
    timer.Start();
}
于 2010-07-21T06:46:43.777 に答える
6

申し訳ありませんが、Quartz.netへのリンクのみを提供しますが、これは完全に認定された、エンタープライズであり、テスト済みの...ライブラリです...車輪を再発明する必要はありません:)

オーバーヘッドについて心配している場合、オーバーヘッドの定義は何ですか? ファイルサイズ(バイナリは約0,5mb)またはロジックのオーバーヘッドです。ロジック部分については、IJobインターフェースを実装することで、消費者のより良いコードを強制するのに適していると思います。私はインラインメソッドの大きな友人ではありません (例として、タイマーの経過時にポインターを起動する可能性があるため) - クラスはより多くの可能性を提供し、もう一度、より良い oop、ドメイン設計、.. .

しかし:Console.WriteLine(...)quartz.netでやるのはやり過ぎです... :)

于 2010-07-21T06:52:53.360 に答える