我有一个用c#编写的windows服务。它内部有一个计时器,可以定期触发一些函数。所以我的服务的框架是:
public partial class ArchiveService : ServiceBase
{
Timer tickTack;
int interval = 10;
...
protected override void OnStart(string[] args)
{
tickTack = new Timer(1000 * interval);
tickTack.Elapsed += new ElapsedEventHandler(tickTack_Elapsed);
tickTack.Start();
}
protected override void OnStop()
{
tickTack.Stop();
}
private void tickTack_Elapsed(object sender, ElapsedEventArgs e)
{
...
}
}
它工作一段时间(例如10-15天),然后停止。我的意思是,服务显示为正在运行,但它没有做任何事情。我做了一些日志记录,问题可能出在计时器上,因为在此时间间隔之后,它不会调用tickTack_Elapsed函数。
我正在考虑不使用计时器重写它,使用一个无限的循环,在我设置的时间量内停止处理。这也不是一个优雅的解决方案,我认为它可能会对记忆产生一些副作用。
计时器从System.Timers命名空间中使用,环境是Windows2003。我在不同服务器上的两个不同服务中使用了这种方法,但两者都产生了这种行为(这就是为什么我认为它以某种方式连接到我的代码或框架本身)。
有没有人经历过这种行为?会出什么问题呢?
编辑:
我编辑了这两个服务。其中一个得到了很好的尝试--到处捕捉和更多的日志记录。第二个人定期进行计时器再利用。从那以后他们都没有停止,所以如果这种情况再持续一周,我将结束这个问题。到目前为止,感谢大家。
编辑:
我结束这个问题是因为什么都没发生。我的意思是,我做了一些更改,但这些更改与这件事并不相关,从那时起,这两个服务都运行得很顺利。请将其标记为“已关闭,因为不再相关”。
发布于 2011-07-07 16:42:42
就像许多受访者指出的那样,异常会被计时器吞噬。在我的windows服务中,我使用System.Threading.Timer。它有变化(...)方法,它允许您启动/停止该计时器。可能出现异常的地方可能是可重入性问题--当tickTack_Elapsed的执行时间超过计时器周期时。通常我会像这样编写计时器循环:
void TimeLoop(object arg)
{
stopTimer();
//Do some stuff
startTimer();
}
您还可以lock(...)
您的主循环,以防止重入。
发布于 2008-12-29 14:39:01
计时器中未处理的异常将被接受,并静默地终止计时器。
将计时器代码的主体包装在try-catch块中
发布于 2008-12-29 14:03:02
我以前在计时器和循环服务中都看到过这种情况。通常情况下,捕获的异常会停止计时器或循环线程,但不会将其作为异常恢复的一部分重新启动。
关于你的其他观点...我不认为计时器有什么“优雅”之处。对我来说,在代码中看到循环操作比在计时器方法中更直接。但是优雅是主观的。
内存问题?如果你写得很好,就不会。如果Thread.Sleep()设置不正确,可能会给处理器带来负担。
https://stackoverflow.com/questions/397744
复制相似问题