2010-06-22 5 views
0

J'essaye d'implémenter une fonction de minuterie récurrente asp.net. Je ne suis pas en mesure de créer un service Windows car j'héberge le site sur un environnement partagé et que je n'ai donc pas accès.Minuterie récurrente dans Asp.net

J'ai lu divers moyens d'y parvenir chacun avec leurs propres avantages/inconvénients. Le cache object approach semblait prometteur, mais semble être un hack.

J'ai essayé d'implémenter un httphandler qui va faire tourner un seul objet System.Threading.Timer pour faire un cycle toutes les minutes et faire un peu de travail. Peut-être mettre en file d'attente d'autres éléments de travail.

Voici ce que j'ai jusqu'à présent:

public class Scheduler : IHttpHandler 
{ 
    protected static TimerCallback tcb = null; 
    protected static Timer timer = null; 

    static Scheduler() 
    { 

     tcb = new TimerCallback(DoWork); 
     timer = new Timer(tcb, null, TimeSpan.Zero, new TimeSpan(0, 0, 1, 0)); 
    } 

    private static void DoWork(Object stateInfo) 
    { 
    } 

    public void ProcessRequest(HttpContext context) 
    { 

    } 

    public bool IsReusable 
    { 
     get { return false; } 
    } 

} 

Je lis here que vous devez conscient de la minuterie ne sont pas éliminés lorsque le déchargement AppDomain. Il implique que c'est seulement un problème si vous invoquez du code natif que je ne suis pas. Je ne pouvais pas comprendre comment lier dans l'événement application_end pour disposer de la minuterie à partir du gestionnaire.

Ma question est la suivante: L'approche ci-dessus est-elle loin de la cible? Y a-t-il une meilleure manière de faire cela? Serait-il plus logique d'abandonner les variables statiques et de stocker la minuterie dans l'état de l'application?

Désolé, j'ai besoin d'avis renseignés. J'ai l'impression de tourner en rond.

Merci,

+0

Qu'essayez-vous réellement d'accomplir? Votre HttpHanlder ne se déclenchera que lorsqu'il sera appelé, donc je ne pense pas que cela vous aidera beaucoup. Vous pourriez avoir un service sur une boîte que vous contrôlez qui appelle le HttpHandler - mais c'est un autre hack. Avez-vous demandé au FAI si vous pouvez installer un service? Ils * pourraient * vous laisser si vous demandez gentil. –

Répondre

1

Ceci est un hack complet, espère que je ne suis pas voté vers le bas! - mais vous pouvez développer un composant qui fait partie de votre déploiement web et qui fait une demande Http à un gestionnaire sur le même site - de cette façon (je suppose) votre application pourrait s'appeler pour s'assurer qu'elle n'a pas été déchargée. voir la classe WebClient - désolé de ne pas savoir quel espace de noms se trouve au sommet de ma tête.

Si vous faites cela, vous devrez réfléchir à la façon dont il est redémarré s'il est retiré pour une raison quelconque; et je ne suis pas sûr si vous aurez un comportement étrange si vous avez une application Web qui reste pendant de très longues périodes de temps.