我开发了使用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));
}
}
我错过了什么,如果出现错误,服务会停止?
答案 0 :(得分:0)
也许计时器无法改变。 Timer.Change
返回一个布尔值:
如果计时器成功更新,则true ;否则, false 。
但你没有检查那个结果。我建议每次都可以处理定时器和new
一个新的定时器,因为它已经被触发并且你把它创建为“一次性”定时器,例如。
finally
{
serviceTimer.Dispose();
serviceTimer = new System.Threading.Timer(timerDelegate, null,
diff, new TimeSpan(-1));
}
答案 1 :(得分:0)
如果有人处理同样的问题我会想到这样的事情:
因为我希望我的服务无论如何都能保持活力: 我正在向服务经理报告该服务已成功启动 -
base.OnStart(args);
在配置中,您可以将legacyUnhandledExceptionPolicy设置为true(1)