Executer une procédures automatiquement et régulièrement touts les n ms

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 344 fois - Téléchargée 33 fois

Contenu du snippet

Comment faire une action toutes les x heures est une question souvent posé sur le forum.
Voici l'astuce pour arriver à faire executer un bout de code à asp.net de facon regulière automatiquement.

L'astuce consiste simplement à mettre un timer dans l'application_start du global.asax.

Le code ci dessous utilise un thread pour obtenir un code plus efficace et aussi plus "joli"

Ce code est volontairement tres simple, il n'est pas la pour faire des opérations compliqués. Il enregistre toutes les 10sec la date dans un fichier de Log.

Ce qui est important c'est la facon dont le code fonctionne.
Premièrement quand une application web se charge, la procédure Application_Start est déclenché. Celle ci n'est declenché seulement la premiere fois qu'un visiteur ouvre le site, pour qu'elle soit ensuite redemarré il faut que le serveur IIS soit redemarré. Attention si vous tester ce code, pour arreter l'ecriture du log, il faut arreter IIS !!!

Ensuite une fois qu'Application_Start est lancé, on instancie notre classe, on demarre Start dans un autre thread.

Une fois le thread lancé, la procédure start de la classe test est executé, le timer est créer, attention l'interval est en ms !!! Ensuite on associe la fonction EcrireLog a chaque fois que le timer est "Elapsed" puis on lance le timer, et désormais toute les 10 sec le fichier test.log aura une ligne de plus.

Je rappel que pour arreter l'ecriture du fichier log, il faut redemarrer IIS !!!

Cet astuce ne fonctionne pas chez tout les hebergeurs, les hebergeurs mutualisé stop l'application s'il n'y a plus aucun activité dessus, a 10 min par défaut apparemment.

Source / Exemple :


'Fichier global.asax.vb 

Imports System.Web
Imports System.Web.SessionState
Imports System.IO
Imports System.Threading

Public Class Global
    Inherits System.Web.HttpApplication

    Private oThread As Thread

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Se déclenche lorsque l'application est démarrée

        'on instancie la classe, donne l'adresse de départ du thread, puis lance le thread 
        Dim oTest As New Test
        oThread = New Thread(AddressOf oTest.Start)
        oThread.Start()
    End Sub

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' Se déclenche lorsqu'une erreur se produit
        oThread.Abort()
    End Sub

    Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Se déclenche lorsque l'application se termine
        oThread.Abort()
    End Sub

End Class

Public Class Test

    Private _Fichier As String = "C:\Inetpub\wwwroot\TestVB2003\Test.log"

    'Fonction start sans argument pour le thread !
    Public Sub Start()
        Dim oTimer As New Timers.Timer(10000)  'Attention interval en ms 
        AddHandler oTimer.Elapsed, AddressOf EcrireLog
        oTimer.Start()
    End Sub

    Public Sub EcrireLog(ByVal s As Object, ByVal e As System.Timers.ElapsedEventArgs)

        Dim LogStream As New StreamWriter(_Fichier, True, System.Text.Encoding.UTF8)
        Try
            LogStream.WriteLine(Now())
            LogStream.Close()
        Catch
            'erreur, impossible d'ecrire dans le fichier
        End Try

    End Sub

End Class

Conclusion :


Pour pouvoir directement tester le code il suffit de changer l'adresse du fichier d'inclure le code dans le global.asax.vb et bien sur avoir accordé l'autorisation d'ecriture à aspnet.

Ce code risque surement d'évoluer pour avoir un meilleur controle sur le thread (arreté mettre en pause, redemarré etc...) , il vous sera tout de meme utile comme point de départ.

N'hésiter pas à donner vos impressions sur ce code via les commentaires et une petite note fait toujours plaisir.

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
mercredi 15 octobre 2003
Statut
Membre
Dernière intervention
8 novembre 2008

Alors délà merci pour ce code, décidement bien souvent lorsque je cherche un code et que je trouve la solution qui y a-t-il au bout: JesusOnline! Merci pour ça!
Ensuite concernant l'arret du serveur après N minute, cela peut sans doute être empeché via la sollicitation d'un pas par un site de cron http://cron.hiwit.org/, dite moi si je me trompe...
Messages postés
1
Date d'inscription
lundi 3 janvier 2005
Statut
Membre
Dernière intervention
24 septembre 2006

Bonjour,

je trouve le thread qui declenche le timer est tres bien fait et bien expliqué, ça marche tres bien en ajoutant oThread.Abort()dans application end,
por contre lorsque j ai deployé cette methode dans un autre poste le fichier text ne se genere pas !! je sais pas d où peut venir ce probleme. sachant bien que ce qui concerne le service ASP.net est bien demarré lorsque on ouvre une premiere session ...

Merci à ceux qui vont repondre, et MErci encore une fois pour ce superbe code
Messages postés
1
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
14 février 2005

Concernant l'application_end, celle ci est declenchée par le TimeOut du serveur IIS (au niveau des proprietes de l'application).

Sinon, je ne pense pas, que tu puisses empecher l'arrêt du Thread, car celui fonctionne dans le meme espace que l'application.

3 modes :

* LOW
> L'appli fonctionne dans le meme process qu'IIS
*MEDIUM
> L'appli fonctionne dans le meme process que les autres applications en MEDIUM
*HIGH
> L'appli fonctionne dans un process isolé

Dans les 3 cas, il n'est pas possible d'avoir un processus supplementaire, tout juste, tu peux avoir un beau plantage du serveur.
A moins de parametrer l'application en OUT OF PROCESS
au niveau du module "Component Services", ou, je crois, tu peux le faire aussi sur webconfig

Fred,
Messages postés
4
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
22 janvier 2005

jesusonline>Très bonne idée. Moi aussi je vais l'utiliser. Meme si l'application est stoppée toutes les 10 mn, ce n'est pas bien grave, c'est une très bonne alternative aux lots DTS.

jean-claude>les DTS sont la meilleures solutions selon moi, mais quand tu es hébergé sur un serveur mutualisé qui accepte les DTS, il y a un inconvénient non négligeable. En effet, les lots DTS fonctionne sur un serveur et ne sont donc pas liés à une seule table. Ce qui signifie que tout le monde peut les ouvrir et les modifier, et encore plus grave, voir tes codes de connexions à ta base.
Messages postés
211
Date d'inscription
vendredi 12 décembre 2003
Statut
Membre
Dernière intervention
15 janvier 2010

A mon avis, la seule solution qui fonctionne pour exécuter des procédures à interval régulier est de créer un DTS sur une base SQL Server... (a condition d'en avoir accès ! sur mes hébergements mutualisés, j'ai pas le droit d'en créer, snif)...
Donc si y'a une autre solution merci de la donnée, ça fera des heureux.

Jean-claude
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.