0

我开发了使用 System.Threading.Timer 的 Windows 服务。计时器每 x 分钟启动一次,它工作正常(计时器在方法结束时更新)。但是,如果尝试阻止服务出现错误,尽管我正在更新计时器并告诉他何时重新开始,但为什么会发生这种情况?这是代码:

 System.Threading.Timer serviceTimer;

 protected override void OnStart(string[] args)
 {
     TimeSpan diff;
     diff = nextRun - now;
     TimerCallback timerDelegate =
         new TimerCallback(MyTimerCallback);
     serviceTimer = new System.Threading.Timer(timerDelegate, null, 
         diff, new TimeSpan(-1));
 }

 public  void MyTimerCallback(object something)
 {   
    try
    {
        //possible error that happened
    }
    catch(Exception)
    {

    }
    finally
    {
        //diff is a new variable telling timer when to start again 
        serviceTimer.Change(diff, new TimeSpan(-1));
    }
 }

如果出现错误,我错过了为什么服务会停止?

4

2 回答 2

0

如果有人处理同样的问题,我会想到这样的事情:

因为我希望我的服务无论如何都保持活力:我正在向服务经理报告服务已成功启动 -

 base.OnStart(args);

在配置中,您可以将 legacyUnhandledExceptionPolicy 设置为 true (1)

于 2012-09-13T13:07:24.270 回答
0

也许计时器无法更改。Timer.Change返回一个布尔值:

如果计时器成功更新,则为true ;否则,false

但是您没有检查该结果。我建议可能new每次都处理计时器并设置一个新计时器,因为它已经被触发并且您将它创建为“单次”计时器,例如

finally
{
    serviceTimer.Dispose();
    serviceTimer = new System.Threading.Timer(timerDelegate, null, 
     diff, new TimeSpan(-1));
}
于 2012-09-12T13:48:03.420 回答