2012-09-12 55 views
0

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

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

什么是你在'catch'阻止在做什么?尝试块中的 – Oded

+0

我正在调用Web服务的方法: var result = proxy.ProxyMethod(param,param); 因此,如果服务不可用,可能会出错 – Avicena00

+0

如果出现这样的错误,您的服务_will_将停止并出现未处理的异常。 – Oded

回答

0

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

如果计时器已成功更新;否则,虚假

但是你没有检查结果。我建议可能会每次都配置一个新的计时器,因为它已经被解雇了,并且你创建了一个“一次性”计时器,例如,

finally 
{ 
    serviceTimer.Dispose(); 
    serviceTimer = new System.Threading.Timer(timerDelegate, null, 
    diff, new TimeSpan(-1)); 
} 
0

万一有人有同样的问题,涉及我估计是这样的:

因为我希望我的服务活下去不管什么: 我“米到服务管理,服务有报告成功启动 -

base.OnStart(args); 

在配置上你可以设置legacyUnhandledExceptionPolicy设置为true(1)