Windows服务关闭导致空闲的原因

时间:2009-06-22 08:28:28

标签: vb.net windows-services

我已经构建了一个vb.net Windows服务,除了ping wcf webservice之外什么都不做,并且在晚上处理向这个web服务发送维护请求。它使用计时器事件执行这两项任务。如果该服务除了这两件事之外什么也没做,它在启动时说它正在关闭导致闲置的原因。 Windows服务线程需要一些东西。

在不浪费机器资源的情况下,防止此关闭的最佳方法是什么? 或者我是否错过了关于api的一些设置以禁用空闲检查?

Protected Overrides Sub OnStart(ByVal args() As String)
    Dim keepAliveTimer As New System.Timers.Timer(3600000)
    AddHandler keepAliveTimer.Elapsed, AddressOf  IsWebserviceAliveHandler
    keepAliveTimer.AutoReset = True
    keepAliveTimer.Start()
    Dim interval As Integer = Me.CalculateInterval(8, 25)
    Dim timer As New System.Timers.Timer(interval)
    AddHandler timer.Elapsed, AddressOf SendDailyMaintenanceRequestHandler
    timer.AutoReset = True
    timer.Start()
End Sub 

2 个答案:

答案 0 :(得分:1)

如果计时器在服务中执行工作,它应该可以正常工作。我去年为一个项目实施了一种“心跳服务”。这是一个(有点剥离的)代码示例,它看起来如何:

// assumes that you have using System.Threading; in the top of the file
private Timer _heartbeatTimer;

protected override void OnStart(string[] args)
{
    // the GetTimerInterval function returns an int with the interval (picked
    // up from config file
    _heartbeatTimer = new Timer(HearbeatTimerHandler, null, new TimeSpan(0), 
                                new TimeSpan(0, GetTimerInterval(), 0));
}


private static void HearbeatTimerHandler(object state)
{
    try
    {
        // do the work
    }
    catch (Exception ex)
    {
        // log the exception
    }
}

在我们的案例中,它会定期向Web服务器发出请求,以便在Web应用程序停止时(由于回收或类似情况)启动Web应用程序。

答案 1 :(得分:0)

OnStart中创建一个循环的新线程,直到服务停止。它执行任务然后等待一段时间。这样,服务就不会停止。

以下是线程方法的伪代码:

while (!serviceStopped)
{
    try
    {
        PerformTask();
        Thread.Sleep(24 * 60 * 60000); // Wait 24 hours
    }
    catch (ThreadAbortException)
    {
       break;
    }
    catch
    {
       // Log errors
    }
}