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

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

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.