2008-12-02 9 views
8


Tengo una aplicación donde necesito que el usuario cargue una foto. Después de que la foto se cargue en el servidor, lo que no debería llevar mucho tiempo, el usuario debería obtener una respuesta que es una página HTML normal que dice "gracias ... bla bla bla ..."
Ahora, después de la respuesta se envía de vuelta al cliente y él sigue su camino feliz, quiero que el servidor continúe trabajando en esta foto. Necesita hacer algo que sea pesado y llevaría mucho tiempo. Pero esto está bien porque el usuario no está esperando nada. Probablemente esté en una página diferente.
Así que mi pregunta es, ¿cómo hago esto con ASP.NET. La aplicación que estoy escribiendo es en ASP.NET MVC así que estoy imaginando algo así como¿Cómo continúo trabajando en el servidor después de devolver una respuesta con ASP.NET? (WebForms y MVC)

//save the photo on the server 
//and send viewdata saying "thanks..." 
return View(); 
//keep doing heavy processing on the photo 

Pero supongo que esto no es realmente cómo se hace. Además, como a veces trabajo con ASP.NET WebForms, ¿cómo se hace esto con WebForms también?
¡Gracias!

Respuesta

5

Hacemos esto para una situación de registro de peso ligero:

Action<object> d = delegate(object val) 
{ 
    // in this anonymous delegate, write code that you want to run 
    ProcessDataAndLog(); 
}; 

d.BeginInvoke(null, null, null); // this spins off the method asynchronously. 

Es de ninguna manera robusta. Si necesita una garantía de procesamiento, debe considerar una cola de mensajes. De esta forma, también puede descargar el procesamiento a una máquina separada y no saturar su servidor web.

EDIT:

Lo siguiente también funciona, y es quizás un poco más evidente a su compañero de codificador. Es esencialmente lo mismo, pero aparentemente más rápido y no necesita preocuparse por llamar a EndInvoke().

System.Threading.ThreadPool.QueueUserWorkItem(
    delegate(object state) 
    { 
     // in this anonymous delegate, write code that you want to run 
     ProcessDataAndLog(); 
    }); 

Lectura adicional: The Thread Pool and Asynchronous Methods y Asynchronous delegate vs thread pool & thread y Does not calling EndInvoke really cause a memory leak ?

+0

Y termina con una posible pérdida de memoria. Uno siempre debe llamar a EndInvoke. – leppie

+0

Quizás, pero no siempre. Caveat Emptor. Primero recogió la idea de Rick Strahls blos http://www.west-wind.com/WebLog/posts/368975.aspx El pensamiento/prueba actual es que no se producen 'filtraciones' si no se hace referencia al valor de retorno IAsync, se limpia después de que el delegado finaliza. –

+0

Diciendo que, en lecturas posteriores, volveré a visitar este frente a ThreadPool.QueueUserWorkItem .. ambos utilizan el grupo de subprocesos y, aunque este último es más rápido, ambos pueden interrumpir el servidor bajo carga, y se puede necesitar un enfoque diferente. –

1

Me parece que necesita hacer girar otro proceso para hacer lo que necesita hacer. Incluso podría querer construir un servicio de Windows para manejar el procesamiento de la imagen. Podría ser una aplicación que se sienta esperando que un archivo aparezca en alguna parte y, cuando lo hace, puede funcionar dejando el hilo de asp.net para continuar su actividad.

0

No soy programador de ASP.NET, pero la forma en que generalmente lo hace es iniciar otro subproceso en el servidor, que hace este procesamiento en segundo plano mientras el subproceso de origen devuelve la vista y sale.

ver si puede encontrar algo si la búsqueda de "Inicio de Tema ASP.NET"

+2

IIS puede reciclar el proceso (y matar a ese hilo) de muchas condiciones - algunas de las cuales no son predecibles. Entonces, usar hilos para un trabajo de fondo no relacionado con una solicitud/respuesta no es una buena idea. –

0

Parece que tendría que tener un segundo proceso que se encarga del procesamiento adicional. Puedes hacer que tu página original inicie el proceso o podrías tener una aplicación independiente que sondee una carpeta y procese a medida que lleguen las fotos. De esta forma, también evita que se grava el servidor web y el proceso de trabajo.

1

Una forma en que lo he hecho en el pasado, que juega bastante bien con el modelo web, es tener un servicio web/página "privado" que se encarga de iniciar el procesamiento y escuchar una llamada. Es bastante fácil tener una página que habla asincrónicamente con otra página y luego continuar con lo que el usuario esté haciendo.

0

que probablemente crear un servicio de Windows que se ejecuta en el servidor y utilizar un relleno de una cola para procesar la foto.por lo que cambiaría su

//save the photo on the server 
//Add referance in queue (possibly in database to http post that the windows service monitors with details of path to the file, output path, transformation etc.) 
//and send viewdata saying "thanks..." 
return View(); 

Hacerlo de esta manera el procesamiento real de la foto es completamente independiente de la página web y guardar que girar hilos por todo el lugar.

Colin G

Cuestiones relacionadas