超时异常使Windows服务无响应

时间:2014-09-22 21:17:17

标签: c# .net exception-handling windows-services

我有一个Windows服务,可以执行以下操作:

  1. 连接数据源OnStart。
  2. 调用方法每5秒从数据源获取数据并将其保存到数据库中。
  3. 呼叫第三方Web服务每5秒处理一次数据。
  4. 设置:

    在同一个计时器过去时,将调用第2点和第3点。有时,第三方Web服务会超时。在这种情况下,我们捕获异常,将其记录在我们的数据库中,然后不再抛出它。我们的想法是,当计时器再次过去时,我们想重新调用Web服务,因为改进第三方服务是我们无法控制的,无论如何这并不经常发生。这是ProcessData()的一些伪代码:

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

    问题:

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

    问题:

    虽然我们现在将这两件事分成两个不同的服务,但我试图找出当前逻辑中出了什么问题?为什么Windows服务没有响应?

1 个答案:

答案 0 :(得分:0)

一种可能性是,查询数据并使用数据调用Web服务的时间超过5秒,这样您的计时器事件就会开始相互堆积。

在尝试再次处理数据之前,请考虑使用变量来跟踪您是否正在处理数据。类似的东西:

private bool _processingData = false;

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

        QueryForData();
        ProcessData();

        _processingData = false;
    }
}