2011-09-15 4 views
0

私はn個(現在n = 2)のインスタンスを持つAzureワーカーロールを持っています。これらの各インスタンスには、メインスレッド上にSystem.Timers.Timerがあり、20秒ごとに実行され、いくつかの作業プロセスが生成されます。ロールインスタンスが最初に起動すると、タイマーが同時に起動するように内部エンドポイント経由で同期します(これは機能します)。System.Timers.TimerがAzureワーカーロールでさまよっています

同じ間隔のこれらの2つのタイマーは、使い勝手が良くなるまでに数秒から始まり、もう1つは同じ方向に、さらに悪くなる可能性があります。

public override void Run() 
{ 
    while (true) 
    {    
     GC.KeepAlive(this.LogTimer); // make sure garbage collection never touches the timer            
    } 
} 

質問:これを引き起こしている可能性がありますどのような

  1. 私のrunメソッドは、以下の基本的でしょうか?

  2. while(true){}ループへのThread.Sleep(sleeptimeinMS)呼び出しを追加すると、メインスレッドが常にビジー状態にならないようにして、 が改善されます( には何らかの方法で自由にできるその義務?)?
  3. ロールを 外部クロックに定期的に再同期しようとするべき正しい答えはありますか?
  4. これを実装する根本的に異なる方法はありますか?

お時間を事前に感謝し、

アレックス

答えて

2

はAでSystem.Timers.Timerは、それがOSにスレッドのスケジューリングによって制限され、100%正確ではありません。 2つの別々のサーバーがそれぞれタイマーを実行していて、最終的には同期が外れることは理にかなっています。

+0

はい、私はSystem.Timers.Timerの精度の制限がありますが、私は見ている動作に驚いていませんが、私のアプリケーションは100%の精度を必要とせず、 5秒以内に2番目のタイマー(私は元の投稿でこれを言っていたはずです)。これらの期待を踏まえて、あらゆる戦略を提案できますか? – user483679

+0

各チックの後に時計と同期してみてください。 1回のチックは、5秒のウィンドウ内で快適に叩くほど正確でなければなりません。 – driis

+0

OK ...あなたはおそらく正しいでしょう。私は座って、不必要な経過イベントを回避するタイマーのスレッドを管理するコードを書くだけでよいのです。ありがとう。私が試してみて、これがうまくいくかどうかを信じてください。 – user483679

関連する問題