Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXECUTER UNE PROCÉDURES AUTOMATIQUEMENT ET RÉGULIÈREMENT TOUTS LES N MS


Information sur la source

Catégorie :ASP.Net Source .NET ( DotNet ) Classé sous : automatisme, application, procédure, iis Niveau : Débutant Date de création : 07/01/2005 Date de mise à jour : 10/01/2005 01:41:19 Vu : 11 951

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


Description

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

  • '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
'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.
 

Historique

07 janvier 2005 02:15:22 :
10 janvier 2005 01:41:19 :
Precision

Commentaires et avis

signaler à un administrateur
Commentaire de jcq le 07/01/2005 08:51:33

Salut cyril, excellent exemple, par contre je ne suis pas d'accord (enfin je vais retester dans la journée) sur le fait qu'Application_Start est déclenché au démarrage de IIS...
Sur un hébergement mutualisé par exemple, ton application est déchargé de la mémoire si aucun visiteur ne va dessus au bout d'un certain temps(je ne connais pas le temps par défaut, mais c de l'ordre d'une dizaine de minutes je pense), et elle est rechargée dès qu'un visiteur va sur le site(pour cette raison que c'est plus long à afficher dès fois).

Sinon ben ton exemple est comme d'habitude très bien fait, je pense que je vais l'utiliser pour déclencher tous les jours l'envoi d'un rapport...

jean-claude

signaler à un administrateur
Commentaire de Senynium X le 07/01/2005 09:01:03

D'accord avec Jean-Claude, (mais je l'ai pas encore testé).
Code bien commenté et très clair ...
Je l'utiliserai également (après test bien sûr)

signaler à un administrateur
Commentaire de jcq le 07/01/2005 11:12:51

J'ai mis sur un site en production ce matin un log dans l'application_start et application_end sur un serveur mutualisé.
Résultat, je confirme que l'application_end intervient si personne n'est présent sur le site au bout de 10 minutes, l'Application_Start sera déclenché quand un visiteur se connectera sur le site...

jean-claude

signaler à un administrateur
Commentaire de jesusonline le 07/01/2005 12:19:27 administrateur CS

zut, j'ai testé en local, et ca marchait bien, meme sans visiteur et ca durait plus de 10min.
Je regarde si je peux faire quelque chose, en essayant de supprimer le othread.abort dans le application_end ?

Cyril

signaler à un administrateur
Commentaire de jcq le 07/01/2005 15:12:30

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

signaler à un administrateur
Commentaire de jfbernier le 22/01/2005 17:05:49

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.

signaler à un administrateur
Commentaire de fred9595 le 14/02/2005 19:20:48

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,

signaler à un administrateur
Commentaire de camillus_9 le 24/09/2006 00:30:38

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  

signaler à un administrateur
Commentaire de esperento57 le 08/11/2008 12:36:29

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...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Procédure stockée [ par Ju ] Bonjour à vous tous, voilà j'ai quelques petits pb avec l'application de Procedure stockée. Je fais ma connexion à la base de données dans le global.a Comment debugger une application asp ? [ par adebruyn ] Bonjour à tous,J'essaie depuis trop longtemps de debugger une application asp ! Je suis sous IIS 5.0 (w2k server) et visual interdev 6.0. J'ai lu et a iis: erreur 500 et Server Application Error [ par tiguy21 ] SalutJe viens d'installer IIS. Il fonctionnait avant, avec le SP2 de windows xp, mais jai remis le sp1, car javais des problemes avec le SP2. IIs fonc IIS : 2 Sites Web SSL mais une seule application ASP.NET ... [ par samfra ] Bonjour,1. Si je crée 2 sites web dans IIS, IIS me charge 2 instances de mon application.Est-ce que quelqu'un sait faire en sorte que ce soit la .NET1.1 et 2.0 [ par JPP80FR ] sous Windows SBS 2003 et IIS 6 j'ai des application comme Sharepoint et le module "Remote Web Workplace" demande le framwork  1.1 et des base MS SQL 2 IIS, kesako ? [ par OneHacker ] Qu'est ce que IIS ? Pour afficher des pages HTML y a t il besoin de créer une application serveur ? Est ce que Windows XP Pro, suffit pour créer une a Connexion distante à IIS [ par Paulo2901 ] Bonjour à tous.J'ai un problème très sérieux.Je viens de terminer la réalisation d'une application web qui doit tourner en Intranet. Durant tout le dé ASP.NET 2.0 Avec IIS 5.1 [ par clemien ] Bonjour,je souhaite mettre une application developper avec visual studio 2005 en production sur un serveur IIS 5.1.J'ai ajouter installer le framework Cas précis pour l'utilisation des sessions [ par Max207 ] Bonjour à tous,Je dois développer une application d'après une analyse technique précise. En gros je dois faire une double authentification d'abord par Authentification avec login/pass dans le WEBCONFIG [ par syl62 ] Bonjour,je rencontre le problème suivant.J'ai créé 1 page Login contenant 1 textbox LOGIN, 1 textbox PASS et 1 bouton pour l'envoi.Dans le webconfig,


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,796 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.