Question

Comment cela se fait le mieux? Je veux une application qui est en cours d'exécution sur un serveur pour déclencher un événement tous les soirs à 03h00.

Était-ce utile?

La solution

Utilisez les fenêtres planificateur de tâches

Autres conseils

Si vous voulez faire dans l'exécution du code d'application (au lieu d'utiliser un planificateur de tâches), vous devez choisir une durée de laisser votre sommeil application qui est assez longue (par exemple, 1 heure ou 3.600 sec). Votre application boucles, et que chaque appel de sommeil arrive à expiration, l'application vérifie périodiquement combien de temps il reste avant l'heure limite (3h00). Une fois que le temps de sommeil restant passe en dessous de l'intervalle de temps grossier, il devrait être réduit à un intervalle plus court (divisé par deux à chaque fois, ou réduit à 10 sec). Continuer la boucle, le sommeil et la réduction de l'intervalle de temps, jusqu'à ce que le temps de délai cible est atteinte.

Cela empêche la boucle de se réveiller trop souvent (86.400 des intervalles de 1 sec est surpuissant), mais il empêche également la boucle d'application de dépassement du temps limite cible en dormant trop longtemps.

Vous pouvez faire une minuterie avec un intervalle de 1 seconde et lorsque la minuterie se déclenche, vérifiez si elle est 03h00.

Vous aurez besoin de le construire dans un service afin d'assurer qu'il fonctionne même s'il n'y a personne connecté à la machine, puis il y a beaucoup de différentes méthodes pour faire en sorte que le déclenchement se produit.

Pensez à faire un System.Timers.Timer où le Interval est fixé à la différence entre DateTime.Now et 3h00 suivant.

Il y a deux options de base ici.

Si vous essayez de le faire dans un service existant, vous pouvez utiliser un minuterie pour vous déclencher à 03h00 chaque soir, et exécutez votre "tâche".

Cela étant dit, cela est généralement mieux géré par Planificateur de tâches windows . Au lieu de maintenir l'application en vie 24/7, vous planifiez juste courir une fois par jour à 03h00.


Edit:

Si vous avez besoin de travailler avec le planificateur de tâches à partir du code (mentionné dans un autre commentaire), qui est également possible. Le Planificateur de tâches prévoit la mise en place d'un API les tâches individuelles ( ITask ) par le planificateur de tâches ( ITaskScheduler ).

Cependant, étant donné que vous travaillez sur XP Embedded, vous êtes probablement mieux juste en utilisant les capacités de configuration du système normal, et la mise en place d'une tâche à exécuter une fois par jour. Dans un système embarqué, vous devriez avoir suffisamment de contrôle pendant votre déploiement pour le faire.

Voici une version simplifiée d'un service que nous avons écrit une minuterie qui exécute toutes les 60 secondes pour voir une table ... vous pouvez modifier l'événement s'écouler minuterie pour vérifier le temps et l'exécuter alors:

Dim Timer As System.Timers.Timer

Protected Overrides Sub OnStart(ByVal args() As String)
    Timer = New System.Timers.Timer(60000)
    AddHandler Timer.Elapsed, AddressOf timer_Elapsed
    Timer.Start()
End Sub

Protected Overrides Sub OnStop()
    Timer2.Stop()
End Sub

Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
    'Ensure the tick happens in the middle of the minute
    If DateTime.Now.Second < 25 Then
        Timer.Interval = 65000
    ElseIf DateTime.Now.Second > 35 Then
        Timer.Interval = 55000
    ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
        Timer.Interval = 60000
    End If

    'Logic goes here
 End Sub

De toute évidence, si vous le pouvez, utilisez le planificateur de tâches comme tout le monde a mentionné ici. Il est le meilleur moyen de le faire. Je viens arrivé d'avoir ce code autour de la pose donc je pensais que je post-it dans le cas où il pourrait être utile pour vous. En outre, ce code a fonctionné pour nous parce que nous ne savions jamais quand une source externe allait modifier une table. Réglage de l'intervalle à un nombre correct de millisecondes serait un moyen beaucoup plus efficace de le faire, comme l'a souligné md5sum.

Cette réponse est peut-être un peu le champ gauche, mais nous utilisons souvent CruiseControl.NET certaines de nos tâches planifiées. Ce n'est pas parfait pour tous, mais si c'est un grand travail que vous voulez exécuter tous les soirs et autres codes / résultats dépendent alors il est un bon choix. Vous pouvez le programmer pour exécuter chaque fois, obtenir des e-mails si cela a fonctionné / échoué. Exécutez d'autres scripts / code si elle ne fonctionne pas, nettoyer les fichiers dont vous avez besoin avant de commencer et après.

Pas la solution idéale pour toutes les situations, mais il est sacrément puissant pour ceux qui l'exigent. Nous l'utilisons pour certains de nos gros travaux de traitement de données, et il nous envoie tous un email si cela a fonctionné / échoué et même essayer à nouveau 30 minutes plus tard, si elle n'a pas la première fois. Il vous donne un sentiment agréable floue:)

planificateur de tâches de Windows (tel que suggéré par klausbyskov) ou un travail SQL Server.

EDIT:

Ou si vous voulez un temps imparti dyanically, vous pouvez créer un service de fenêtres sondages toutes les 10 minutes et exécute une action au moment voulu (s).

Création d'un serveur Windows en C # est assez trivial et pourrait le faire . Assurez-vous que vous avez la sécurité et l'exploitation forestière cernées tant il peut être assez difficile de dire ce qui se passe alors qu'il est (ou non) fonctionnement.

Utilisez System.Threading.Timer .

Je suis d'un thread dans une application ASP.NET pour effectuer des tâches planifiées.

Cela dépend de ce que vous avez à votre disposition.

Votre meilleur pari est d'utiliser un Cron emploi, si vous êtes sous Linux / Unix / Mac OS X, un planificateur de tâches sous Windows, ou launchd sur les nouvelles versions de Mac OS X .

Si vous voulez faire à partir d'une application, vous auriez besoin d'une boucle qui vérifie le temps sur une base régulière et les incendies de l'événement si elle est 03h00, mais ce n'est pas idéal.

Le programme capable d'exécuter via la ligne de commande? Si, créez un fichier foo.bat, et appelez votre ligne de commande de programme (très simple).

Ensuite, utilisez Planificateur de tâches pour exécuter le fichier .bat à 3 heures par jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top