Служба Windows закрывается из-за простоя - PullRequest
0 голосов
/ 22 июня 2009

Я создал службу Windows vb.net, которая ничего не делает, только пропингует веб-сервис wcf и обрабатывает отправку запроса на обслуживание в тот же веб-сервис в ночное время. Он выполняет обе задачи, используя событие таймера. Если служба ничего не делает, кроме этих двух вещей, при запуске она говорит, что закрывается из-за простоя. Потоку службы 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 ]

1 голос
/ 22 июня 2009

Должно работать хорошо, если таймер выполняет работу в службе. Я реализовал своего рода «сердцебиение» для проекта в прошлом году. Вот (несколько урезанный) пример кода из того, как он выглядит:

// 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
    }
}

В нашем случае он регулярно выполняет запрос к веб-серверу о запуске веб-приложения в случае его остановки (из-за повторного использования или подобного).

0 голосов
/ 22 июня 2009

В OnStart создайте новый поток, который зацикливается до остановки службы. Он выполняет свою задачу, а затем ждет некоторое время. Таким образом, служба не остановится.

Следующим псевдокодом для метода потока будет:

while (!serviceStopped)
{
    try
    {
        PerformTask();
        Thread.Sleep(24 * 60 * 60000); // Wait 24 hours
    }
    catch (ThreadAbortException)
    {
       break;
    }
    catch
    {
       // Log errors
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...