0

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

1 日のうちでも、これら 2 つのタイマーは同じ間隔で動き回る傾向があります。一方は以前よりも数秒早く開始し、もう一方は同じ方向に進むか、最悪の場合は他方に進む可能性があります。

私の実行方法は基本的に次のとおりです。

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

質問:

  1. 何が原因でしょうか?
  2. while(true){} ループに Thread.Sleep(sleeptimeinMS) 呼び出しを追加すると、メイン スレッドが常にビジー状態になるのを防ぐことでこれが改善されますか (タイマー スレッドが何らかの形でより自由にその義務を果たせるようにするためですか?)。
  3. 役割を定期的に外部クロックに再同期する必要があるというのは正しい答えですか?
  4. これを実装するための根本的に異なる方法はありますか?

お時間をいただきありがとうございます。

アレックス

4

1 に答える 1

2

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

于 2011-09-15T20:34:44.960 に答える