超时异常离开Windows服务反应迟钝

问题描述:

我有一个Windows服务,做以下的事情:超时异常离开Windows服务反应迟钝

  1. 连接到数据源的OnStart。
  2. 调用一种方法,每5秒从数据源获取数据并将其保存到数据库。
  3. 调用第三方Web服务以每5秒处理一次数据。

的设置:

两个点2和3被称为在同一定时器的经过。有时,第三方Web服务会超时。在这种情况下,我们捕获异常,将其记录在我们的数据库中,然后不要再抛出它。我们的想法是,当定时器再次过期时,我们想重新调用Web服务,因为改进第三方服务不在我们的控制范围内,并且在任何情况下都不会经常发生。下面是过程数据()的一些伪代码:

private bool ProcessData() 
{ 
    bool hasBeenProcessed = false; 

    try 
    { 
     // Call web service 
     // If successful 
     hasBeenProcessed = true; 
    } 
    catch(Exception ex) 
    { 
     // Log exception 
    } 

    return hasBeenProcessed; 
} 

问题:

我们的windows服务完全停止工作,即使异常被处理,而不是重新抛出。忘记第3步,我们无法看到数据库中的任何数据应该作为第2步的一部分来完成。理想情况下,我们不希望数据收集因为数据处理中的问题而受到影响。该服务本身在服务管理器中显示为正在运行。尽管从服务管理器停止服务不起作用。

问:

虽然我们现在分开这两件事情分成两个不同的服务,我试图找出什么地方出了错在目前的逻辑是什么?为什么Windows服务变得无法响应?

+0

其中是正在处理的异常可以广告或显示您正在执行的日志逻辑..?基于你已经显示你的方法调用的代码什么也不做 – MethodMan 2014-09-22 21:19:32

一种可能性是查询数据和调用带有数据的Web服务花费的时间超过5秒,因此您的计时器事件开始彼此堆叠在一起。

在尝试再次处理数据之前,请考虑使用变量来跟踪是否正在处理数据。例如:

private bool _processingData = false; 

private void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{  
    if (!_processingData) 
    { 
     _processingData = true; 

     QueryForData(); 
     ProcessData(); 

     _processingData = false; 
    } 
}