2009-05-28 22 views
7

Me gustaría tener un temporizador para una aplicación ASP.net que comenzará todos los domingos por la noche y realizará algo (actualice una tabla en la base de datos). Sin embargo, realmente no quiero escribir un servicio que deba implementarse en el servidor además de la aplicación web. ¿Hay alguna manera de lograr esto fácilmente? Tal vez usando un archivo Global.asax?Global Timer en Asp.net

+1

No creo que una aplicación web sea la herramienta adecuada para esto, pero si sigues adelante una consideración importante: ¡apaga el reciclaje de IIS si planificas que tu aplicación se desarrolle en horarios tan largos! – annakata

+1

duplicado: http://stackoverflow.com/questions/542804/asp-netbest-way-to-run-scheduled-tasks –

+2

@mausch buen hallazgo ... Terminé explorando esa pregunta y encontré http: // blog .stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/que parece ser la mejor solución para mí. – Darwyn

Respuesta

9

Parece que la mejor solución fue utilizar this technique. Si tuviera más control sobre el servidor, probablemente escribiría una aplicación de consola para aprovechar las tareas programadas.

+0

Este es de lejos el mejor ejemplo. Todos los demás comentarios se basan en las visitas a la página. –

+0

Esto es hermoso – Zeus

3

Escribo una aplicación de consola y uso Tareas programadas para programarla.

+0

Tareas programadas sería ideal si tuviera control total sobre el servidor ... Desafortunadamente no lo hago. Voy a votar tu respuesta solo para dar a conocer esta opción. – Darwyn

+0

En realidad, es un truco, me gusta el truco, pero es un truco. Agregué la respuesta de antera con otro truco que puedes probar. Desafortunadamente, no creo que ASP.NET soporte directamente lo que quieres hacer. – jrcs3

4

No estoy 100% seguro de donde lo pondría, pero usar un System.Threading.Timer lo sacudiría.

// In some constructor or method that runs when the app starts. 
// 1st parameter is the callback to be run every iteration. 
// 2nd parameter is optional parameters for the callback. 
// 3rd parameter is telling the timer when to start. 
// 4th parameter is telling the timer how often to run. 
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(TimerElapsed), null, new Timespan(0), new Timespan(24, 0, 0)); 

// The callback, no inside the method used above. 
// This will run every 24 hours. 
private void TimerElapsed(object o) 
{ 
    // Do stuff. 
} 

Inicialmente, usted tiene que determinar cuándo se debe iniciar el temporizador de la primera vez, o puede activar el sitio en el momento que desee este temporizador se ejecuta en la noche del domingo.

Pero como han dicho otros, use algo que no sea el sitio para hacer esto. Es muy fácil hacer un servicio de Windows para lidiar con esto.

+0

Parece que el mejor lugar para poner un temporizador como el de su ejemplo sería en el controlador Application_Start del archivo Global.asax. – Darwyn

+1

Sin duda tendrá que realizar una comprobación para asegurarse de que este temporizador no se esté ejecutando. Ya puedo ver a alguien usando este ejemplo y generando miles de subprocesos porque lo conectaron al controlador de eventos Application_Start. –

0

No creo que una aplicación .NET sea una buena solución a su problema.

IIS Recycling reciclará el proceso cada pocas horas (dependiendo de la configuración) e incluso si establece ese intervalo en siete días, el grupo de aplicaciones todavía se puede reciclar por otros motivos que escapan a su control.

Estoy de acuerdo con jcrs3: solo escriba una pequeña aplicación de consola y use el programador. También puede escribir un servicio, pero si necesita algo rápido y fácil, vaya a la aplicación de la consola.

0

En respuesta a tu comentario sobre tareas programadas:

Otro truco sería para anular un evento en Global.asax, incluso una que se llama a menudo como Application_EndRequest() y hacer algo similar a:

protected void Application_EndRequest() 
{ 
    if (((DateTime)Application["lastTimeRun"]) < DateTime.Today) 
    { 
     Application["lastTimeRun"] = DateTime.Today; 
     doSomething(); 
    } 
} 

esto iría después de la primera solicitud después de la fecha cambia, por lo que no estaría garantizado que esta sería dirigido precisamente a las 3:00 am cada mañana.

Incluso tengo casos de semilla donde podría golpear el sitio usando una tarea programada en otra computadora.

1

Pruebe el Quartz .NET, un programador de tareas para la aplicación empresarial .NET como ASP .NET y esto debería cumplir su propósito.