2008-09-05 4 views
7

Dada una aplicación ASP.NET, necesito ejecutar un proceso de mantenimiento de forma periódica (diaria, por hora, etc.).¿Cuál es la mejor práctica para iniciar el proceso de mantenimiento en ASP.NET

¿Cuál es la mejor manera de lograr esto sin depender de un proceso externo como una tarea programada en el servidor (supongamos que no tengo acceso al servidor - entorno de alojamiento compartido).

+0

Esta pregunta está fuera del tema de Stack Overflow, ya que está buscando mejores prácticas, lo que atrae respuestas obstinadas. – cybermonkey

Respuesta

11

Aquí es la forma en que Stackoverflow lo hace:

private static CacheItemRemovedCallback OnCacheRemove = null; 

protected void Application_Start(object sender, EventArgs e) 
{ 
    AddTask("DoStuff", 60); 
} 

private void AddTask(string name, int seconds) 
{ 
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, seconds, null, 
     DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, 
     CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
{ 
    // do stuff here if it matches our taskname, like WebRequest 
    // re-add our task so it recurs 
    AddTask(k, Convert.ToInt32(v)); 
} 

Detalles: http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

+1

Jeff Atwood dice: 12 de febrero de 2009 a las 6:50 a.m. No, hemos cambiado a una tarea dedicada. Definitivamente superamos esta técnica. ¡Sí creo que está bien para sitios pequeños! –

2

Una forma de hacerlo, si no necesita hacerlo en un tiempo programado, pero solo tiene que limpiar "de vez en cuando", es crear una función en su Global.asax Session_OnEnd() que creará un número aleatorio entre 1 y 100, y si el número es, por ejemplo, 50, ejecutará la tarea de mantenimiento.

Offcourse puede reducir el "100" para que la tarea suceda con más frecuencia.

También hay un artículo titulado 'Simular un servicio de Windows utilizando ASP.NET para ejecutar trabajos programados' en http://www.codeproject.com/aspnet/ASPNETService.asp que utiliza un caché que expira para simular un temporizador. Afirma que se puede ejecutar en cualquier sitio alojado.

Si está utilizando la última, por favor lea este comentario de un post acerca de esta técnica:

Tienes que ser muy cuidadoso en la longitud de la tarea en ejecución. Cada tarea nueva es un nuevo Worker Thread y hay un número limitado de ellos - como "toma prestados" un hilo del grupo de threads administrado .

A partir de la versión 3.5 del Marco de la número máximo de hilos era aumentó 10 veces de 25 a 250. Pero ahora hay un inicio logarítmica a ellos, así como que reparte más hilos que obtiene más tacaños con ellos. Si ejecuta sin hilos disponibles en el grupo de subprocesos administrados , su respuesta veces irá a través del techo .

Lo que realmente está escribiendo aquí es un sistema de mensajes/colas .

Si estás haciendo cosas como actualizar el caché, entonces por supuesto - patear de una nueva tarea. Si estás haciendo algo así como la descarga de un recurso HTTP secundario o algún tipo de base de datos trabajo intensivo - escribir un servicio de Windows y utilizar una cola que le permite más control sobre la cantidad que “mordedura” apaga cada vez.

0

esto es un proceso externo y no sé qué tan confiable, pero se podía establecer algo similar en una máquina que usted sabe que siempre está en www.webcron.org.

Básicamente lo que hace es llegar a la página que solicitas en el horario que solicitas.

Esencialmente, podría tener cualquier cosa que aparezca en una página en un horario regular que iniciaría su tarea de mantenimiento.

Jeff y Joel también discutieron sobre hacer cosas similares en un podcast reciente a través de otros métodos.

1

Si bien la forma en que StackOverflow hace esto es definitivamente único, es posible que desee monitorear este question también, ya que se relaciona.

2

Mientras que la solución de caché funciona para casos simples, si su programación necesita alguna vez, no tendrá suerte. En su lugar, podría usar Quartz.NET, un puerto del popular marco java Quartz, que es muy flexible.

Cuestiones relacionadas