我有一个用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函数。我当时正在考虑使用无穷循环而不使用计时器来重写它,这会在我设置的时间内停止处理。这也不是一个很好的解决方案,我认为它可能会对内存产生一些副作用。
Timer是从System.Timers命名空间中使用的,环境是Windows2003。我在不同服务器上的两个不同服务中使用了这种方法,但是两者都产生了这种行为(这就是为什么我认为它以某种方式连接到我的代码或框架本身)。
有人经历过这种行为吗?有什么事吗
编辑:
我编辑了两个服务。一个到处都有不错的try-catch和更多的日志记录。第二个定期进行计时器娱乐。自从他们以来,他们没有一个停止过,因此,如果这种情况再持续一周,我将结束这个问题。到目前为止谢谢大家。
编辑:
我结束了这个问题,因为什么都没发生。我的意思是我进行了一些更改,但是这些更改在此问题上并没有真正的意义,并且自那时以来,这两个服务都没有问题地运行。请将其标记为“已关闭,不再相关”。
最佳答案
就像许多受访者指出的那样,计时器会吞噬异常。在Windows服务中,我使用System.Threading.Timer。它具有Change(...)方法,可让您启动/停止该计时器。重入问题可能是发生异常的地方-如果tickTack_Elapsed执行的时间超过计时器时间。通常我会这样写定时器循环:
void TimeLoop(object arg)
{
stopTimer();
//Do some stuff
startTimer();
}
您还可以
lock(...)
您的主循环,以防止重入。关于c# - 带有计时器的.NET Windows服务停止响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/397744/