2009-05-06 13 views
2

J'ai écrit un service Windows VB.NET, qui fonctionne très bien. Je n'ai qu'un problème avec ça. Je veux que le service s'exécute sur la demi-heure et le haut de l'heure (par exemple 9h00, 9h30, 10h00, 10h30, 11h00, etc etc etc). Je suis en utilisant le code suivant:VB.NET Timer question

Protected Overrides Sub OnStart(ByVal args() As String) 
    ' Add code here to start your service. This method should set things 
    ' in motion so your service can do its work. 
    Dim oCallBack As New TimerCallback(AddressOf TimedEvent) 
    oTimer = New System.Threading.Timer(oCallBack, Nothing, 300000, 300000) 
    EventLog.WriteEntry("CCFinalizeService has begun successfully." , _ 
         System.Diagnostics.EventLogEntryType.Information) 

End Sub 

Ce code fonctionne, cependant, si le service commence à, disons, 10h15, il exécute à 10h15, 10h45, 11h15, 11: 45 Comment puis-je faire en sorte qu'il s'exécute toujours sur les marques de 30 minutes et en haut de l'heure?

Répondre

0

Vous avez juste besoin de modifier le paramètre dueTime dans la méthode de création temporisateur

Dim now As Date = DateTime.Now 
Dim dueTime As Integer ' milliseconds to the next half-hour 
dueTime = 1800000 - (now.Minute Mod 30) * 60000 - now.Second * 1000 - now.Millisecond 
oTimer = New System.Threading.Timer(oCallBack, Nothing, dueTime, 1800000) 
+0

Savait que ça devait être quelque chose d'aussi simple que ça. Merci! – Icemanind

2

Vous pouvez le modifier de sorte que, au démarrage, il calcule le temps requis pour passer à un incrément d'une demi-heure basé sur l'heure actuelle. Fondamentalement, votre premier temporisateur serait < 300000, puis passer à tous les 300 000.

Vous pouvez également envisager d'utiliser le Windows Task Scheduler au lieu de le faire en tant que service. Le planificateur de tâches vous permet de spécifier des heures spécifiques pour exécuter une application.

+0

+1 pour tâche planifiée vs le service –

+0

Est-ce que pas une tâche planifiée est qu'il nécessite que le système soit connecté ? – BenAlabaster

+0

@balabaster: Non. Le planificateur de tâches s'exécute en tant que service et permet l'exécution des tâches sans connexion d'utilisateurs. Vous pouvez le configurer uniquement pour planifier des tâches lorsqu'un utilisateur est connecté, mais vous pouvez également le configurer pour qu'il s'exécute au démarrage du système, à des heures spécifiques, etc. Il est assez flexible. Voir le lien pour plus de détails. –

0

Probablement la solution la plus simple serait de tester, au démarrage du service, l'heure actuelle, via la propriété Date.Now. Vous pouvez ensuite utiliser une seconde minuterie pour démarrer la première minuterie, mais régler l'Intervalle sur la seconde minuterie pour se déclencher uniquement à la marque de 1/2 heure ou de l'heure suivante.

Alternativement, dans votre routine de démarrage, avoir une boucle infinie qui teste pour voir si l'heure actuelle est sur votre marque. Si ce n'est pas le cas, System.Threading.Thread.Sleep (1000) et testez à nouveau.

Bonne chance!

0

Peut-être quelque chose comme ça ??

If Now.Minute <> 0 Or Now.Minute <> 30 Then 
    Thread.Sleep((30 - Now.Minute) * 60 * 1000) 
End If