Pregunta

Considere este código...

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;

¿Podría ser esto peligroso?Guardar en caché un temporizador en la aplicación para realizar algún trabajo en segundo plano mientras se ejecuta su sitio parece seguro, pero me preguntaba si alguien tiene alguna experiencia con esto.

Estoy seguro de que escribir un Servicio para que se ejecute en segundo plano sería mucho mejor, pero a veces esa no es siempre una opción.¿Es esta una alternativa?

¿Fue útil?

Solución

En general, esto sería una mala idea, ya que System.Threading.Timer usa subprocesos de ThreadPool, al igual que ASP.Net.

Si por alguna razón su delegado del temporizador se bloquea o se detiene, el temporizador simplemente comenzará un nuevo subproceso después del período de tiempo de espera, que devora los subprocesos disponibles para ASP.net.

Si todos comienzan a bloquearse, efectivamente no podrá atender más solicitudes web (probablemente algo malo)

Otros consejos

El problema con esto es que no se garantiza que el proceso siga vivo.IIS recuperará el proceso básicamente cuando lo desee, por lo que corre el riesgo de que no se realice.

Si necesita realizar este trabajo, deberá codificarlo en una llamada web o ejecutar un servicio en segundo plano del servidor.

Eso sería peligroso ya que puede haber ocasiones en las que el proceso de trabajo se recicle o el dominio de aplicación falle y el elemento de trabajo muera y es posible que desee que recupere lo que estaba haciendo; puede que no sea posible.

Un servicio de Windows puede estar bien si puede incorporar ese elemento de trabajo a un servicio.Si se requiere un HttpContext para el trabajo, es posible que desee que un servicio de Windows llame a un servicio web para realizar la llamada periódicamente, lo que puede funcionar, aunque probablemente no sea lo ideal.

Eso tiene sentido, pero solo por diversión, ¿qué pasa si no es necesario ejecutar el trabajo si el sitio se cierra?Si está asociado con el evento Application_Start y solo necesita ejecutarse mientras las personas navegan por el sitio, ¿cuáles son los riesgos en ese momento?

Buenas respuestas, solo tengo un poco más de curiosidad sobre cómo funciona eso en el interior.

Le recomendaría que configure una tarea programada para ejecutar una página en su sitio.Normalmente apunto la tarea programada a un archivo .vbs con lo siguiente:

On Error Resume Next
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

Set objRequest = Nothing

Omar Al Zabir tiene una publicación excelente sobre el uso de devoluciones de llamada de elementos de caché para este propósito.

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=1334820

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top