我已经构建了一个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
答案 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
}
}