C#秒ごとに発射するがリアルタイムで同期しているタイマー(すなわち、ドリフトなし)

StackOverflow https://stackoverflow.com/questions/3296784

  •  18-09-2020
  •  | 
  •  

質問

イベント間に「ドリフト」がないことを確認できるC#で利用可能な.NETタイマーはありますか?つまり、X秒ごとにタイマーを設定した場合、それが運用した日以降、それはドリフトしない、すなわち、1日のX秒イベントのアプローチ数がそれがあるべきことと同期のままであることを確認することを確実にすることです。

そうでない場合は、これを行うためにC#でタイマー機能を折り返すよく知られているコード例がありますか?

役に立ちましたか?

解決

quartz.net へのリンクを提供してすみません、これは完全修飾企業です。、テスト済み、...ライブラリ...あなたはホイールを再発明する必要はありません:)

オーバーヘッドを心配している場合は、オーバーヘッドの定義は何ですか?それはファイルサイズ(バイナリは約0.5MB)またはロジック内のオーバーヘッドです。 Logic-Part:IJob-Interfaceを実装すると、消費者のより良いコードを強制するための良い仕事があると思います。私はそのようなインラインメソッドの大きな友達ではありません(あなたがタイマー経過に彼らのポインタを発射するかもしれないように) - クラスはあなたにはるかに多くの可能性を与え、そしてもう一度、より良いOOP、ドメインデザイン、。。

しかし:quartz.netを使用してConsole.WriteLine(...)を実行することはオーバーキル...:)

他のヒント

私はあなたがすでに何かを試していて、それがドリフトしたと仮定しています。

時間から5秒ごとに火をつけたい場合(5,10,15,20 ..)、あなたのタイマーを1回発射するように設定してから、あなたのコールバックでタイマーを解決するように設定することができます。.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();
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top