2009-06-22 4 views
0

J'ai créé un service Windows vb.net qui ne fait rien d'autre qu'un ping sur un webservice wcf et qui gère l'envoi d'une requête de maintenance à ce même service Web pendant la nuit. Il fait les deux tâches en utilisant un événement de minuterie. Si le service ne fait que ces deux choses, il dit au démarrage qu'il se ferme parce qu'il est inactif. Le thread de service Windows a besoin de quelque chose à faire.Arrêt du service Windows en raison de l'inactivité

Quelle est la meilleure façon d'empêcher cet arrêt sans gaspiller les ressources des machines? Ou est-ce que j'ai manqué un réglage sur l'API pour désactiver le test de ralenti?

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

A quoi ressemble votre méthode 'OnStart()'? –

+0

protégées outrepassés Sub OnStart (ByVal As String args()) Dim keepAliveTimer As New System.Timers.Timer (3600000) AddHandler keepAliveTimer.Elapsed, AddressOf IsWebserviceAliveHandler keepAliveTimer.AutoReset = True keepAliveTimer.Start() intervalle Dim Comme integer = Me.CalculateInterval (8, 25) Dim timer As New System.Timers.Timer (intervalle) AddHandler timer.Elapsed, AddressOf SendDailyMaintenanceRequestHandler timer.AutoReset = True timer.Start() End Sub –

+0

Il serait intéressant de voir le code dans SendDailyMaintenanceRequestHandler (ou au moins la structure de celui-ci) –

Répondre

0

En OnStart créer un nouveau thread qui boucle jusqu'à ce que le service est arrêté. Il effectue sa tâche et attend ensuite une quantité de temps. De cette façon, le service ne s'arrêtera pas.

Ce qui suit serait pseudo-code pour la méthode de fil:

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

J'ai essayé ceci ... mais mon interprtask est trop rapide .. Il semble que le démarreur de service a besoin d'un fil occupé pour entrer dans l'état complètement démarré. Dormir au démarrage semble également dormir le démarrage du service.Après un certain temps, le délai d'attente expire, ce qui indique que le service n'a pas démarré, mais que le processus Windows lui-même a réussi à s'exécuter. Il doit y avoir une meilleure solution. –

+0

Eh bien, le fil est occupé - il dort. Pour clarifier: Ce n'est pas le code pour OnStart! Dans OnStart, vous créez un nouveau thread avec une méthode de thread qui contient le code ci-dessus. –

1

Il devrait bien avoir une minuterie d'effectuer le travail dans un service. J'ai mis en place une sorte de "service de pulsation" pour un projet l'année dernière. Voici un exemple de code (un peu dépouillé) de la façon dont il ressemble:

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

Dans notre cas, il effectue une requête à un serveur Web sur une base régulière pour que l'application web départ dans le cas où il a été arrêté (en raison recyclage ou similaire).

+0

J'ai fait exactement la même chose .. Commencé deux minuteries comme vous l'avez fait .. Mais dans mon cas au démarrage du service le démarreur envoie un message quelque chose comme "Le service a été fermé, dans certains cas cela arrive parce qu'il était inactif" –

+0

Avez-vous veillé à détecter les exceptions qui pourraient survenir? –

Questions connexes