0

我有一个带有 n(当前 n = 2)个实例的 Azure Worker Role。这些实例中的每一个在其主线程上都有一个 System.Timers.Timer,每 20 秒执行一次,产生一些工作进程。当角色实例最初启动时,它们通过内部端点同步自己,以便计时器同时启动(这有效)。

在甚至一天的过程中,这两个具有相同间隔的计时器往往会徘徊 - 一个最终会比过去早几秒钟开始,另一个可能会朝着相同的方向,或者更糟糕的是,另一个。

我的运行方法基本上如下:

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% 准确的,它受到操作系统中线程调度的限制。两个独立的服务器各自运行一个定时器,最终会失去同步,这是很有意义的。

于 2011-09-15T20:34:44.960 回答