2010-02-26 141 views
2

我有一个带有定时器(System.Timers.Timer)的.NET Windows服务(.NET 3.5)。该OnElapsed方法是这样的:Windows服务已启动,但什么都不做 - .NET

private void OnTimerElapsed(object source, ElapsedEventArgs e) 
    { 
     lock (this) 
     { 
      timer.Stop(); 
      //process some stuff here.. 
      ProcessStuff(); 
      timer.Interval = GetTimerInterval(); 
      timer.Start(); 
     } 
    } 

它,直到它神秘地停止工作,工作正常。这种情况每隔x天发生一次,尽管该服务具有启动状态,但它并未启动ProcessStuff()方法。我使用log4net,并且在那里或在Windows事件日志中没有记录任何内容。 ProcessStuff()会产生多个线程来完成一些工作。

我该如何解决这个问题?

+1

我们需要更多的数据来诊断正在发生的事情......您是否尝试过使用调试器来检查服务中线程的状态?根据ProcessStuff()和GetTimerInterval()的作用,你可以挂在某处等待这些函数完成。 – 2010-02-26 21:39:29

回答

2

ProcessStuff()GetTimerInterval()是否可能引发异常,以致timer.Start()未执行?

那么你也许应该换的那部分在try..catch和/或增加一些记录,e.g:

timer.Stop(); 
try 
{ 
    //process some stuff here.. 
    ProcessStuff(); 
} 
catch (Exception ex) 
{ 
    // log the exception? 
} 
timer.Interval = GetTimerInterval(); 
timer.Start(); 
+0

极有可能的理论。 – Nick 2010-02-26 21:40:35

+0

这是可能的,但为什么只有在x天后才会发生。我在ProcessStuff日志中看到未处理的异常,并且定时器仍然可以运行 – DotnetDude 2010-02-26 21:42:31

+0

以确保您还可以添加一个全局异常句柄,该日志句柄记录到系统事件查看器“AppDomain.CurrentDomain.UnhandledException” – 2010-02-26 21:42:52

0

我对你有两个想法。一个创建一个转储,看看什么是或使用远程调试器,看看你在锁定。

+0

我将如何创建转储?你能解释一下吗? – DotnetDude 2010-02-26 21:43:27