4

本当に簡単な質問です。

System.Timers の間隔はどのくらい正確に機能しますか?

タイムアウト イベントにかかる時間に関係なく、1 秒ごとに 1 秒起動しますか?それとも、最初にルーチンを終了してから間隔を再開する必要がありますか?

したがって、次のいずれかです。

  1. 1 秒....1 秒....1 秒など
  2. 1 秒 + 処理時間....1 秒 + 処理時間....1 秒 + 処理時間など

私がこれを尋ねる理由は、私の「処理」にかかる時間は 1 秒よりもはるかに短いことを知っているからですが、ドットで 1 秒ごとに (またはその近くで) 発射したいと考えています。

私は Thread.Sleep メソッドを次のように使用していました。

Thread.Sleep(1000 - ((int)(DateTime.Now.Subtract(start).TotalMilliseconds) >= 1000 ? 0 : (int)(DateTime.Now.Subtract(start).TotalMilliseconds)));

ルーチンの開始時に開始時刻が登録される場所。ここでの問題は、 Thread.Sleep がミリ秒単位でしか機能しないことです。したがって、私のルーチンは 1000 ミリ秒または 1000.0234 ミリ秒のような分数で再起動する可能性があります。これは、私のルーチンの 1 つが「TimeSpan」に従って 0 ミリ秒かかるために発生する可能性がありますが、明らかにティック/ナノ秒を使用しています。毎秒長くなります。ティックまたはナノ秒でスリープできたら、それはすごいことです。

番号 1 が System.Timers に当てはまる場合、私は分類されていると思います。そうでない場合は、スレッドをより高い時間分解能、つまりティック/ナノ秒まで「スリープ」する方法が必要です。

インライン IF ステートメントを使用する理由を尋ねられるかもしれませんが、処理が 1000 ミリ秒を超える場合があるため、マイナスの数値を作成しないようにする必要があります。また、これを決定するまでに、終了時刻がわずかに変更されました。大幅ではありませんが、スレッドの遅延がわずかに長くなり、その後のスリープオフ全体が発生する可能性があります。

時間はごくわずかです...しかし、システムが突然数ミリ秒停止した場合はどうなりますか...この場合、それから保護されます。

更新 1

Ok。そのため、タイミング値として TimeSpan を入れることができるとは知りませんでした。だから私は以下のコードを使用しました:

Thread.Sleep(TimeSpan.FromMilliseconds(1000) - ((DateTime.Now.Subtract(start).TotalMilliseconds >= 1000) ? TimeSpan.FromMilliseconds(0) : DateTime.Now.Subtract(start)));

私が正しければ、これにより、正確に 1 秒、またはシステムが許可する限り、スレッドを繰り返すことができるはずです。

4

1 に答える 1

2

設定しAutoReset = true;た場合、理論 1 は真です。それ以外の場合は、コードで処理する必要があります。MSDNのドキュメントを参照してTimerください。

于 2011-08-28T00:45:30.840 に答える