que - ¿La mejor manera de ejecutar una tarea en segundo plano en la aplicación web ASP.Net y también obtener comentarios?
crear tareas programadas desde c# (4)
Creo que el problema con el almacenamiento del resultado en el caché es que ASP.NET podría recuperar esa entrada de caché para otros fines (es decir, si tiene poca memoria, si está de mal humor, etc.). Algo que se sirve desde la memoria caché debe ser algo que pueda recrear a pedido si no se encuentra en la memoria caché, el tiempo de ejecución de ASP.NET puede volcar las entradas de la memoria caché siempre que lo desee.
El uso de la memoria caché en la discusión de distintivos parece fundamentalmente diferente, en ese caso la tarea fue de corta duración. La memoria caché estaba siendo utilizada como un temporizador Hacky para disparar la tarea periódicamente.
¿Puedes confirmar que esta es una tarea que tardará 5 minutos y requerirá su propio hilo todo el tiempo? Esta es una cuestión de rendimiento en sí misma, solo podrá admitir un número limitado de solicitudes si cada una requiere su propio hilo durante tanto tiempo. Solo si eso es aceptable dejaría que la tarea acapare un hilo durante tanto tiempo.
Si está bien que estas tareas completen un hilo, entonces seguiré y almacenaré el resultado en un diccionario global del proceso. La clave del diccionario se correlacionaría con la solicitud del cliente / serie de devolución de llamada AJAX. La clave también debería incorporar la identificación del usuario si la seguridad es importante.
Si necesita escalar a muchos usuarios, entonces creo que necesita dividir la tarea en pasos asíncronos, y en ese caso probablemente usaría una tabla DB para almacenar los resultados (nuevamente codificados por solicitud / usuario).
Estoy pensando en el siguiente enfoque, pero no estoy seguro si es la mejor manera de salir:
step1 (lado del servidor): una clase TaskMangaer crea un nuevo hilo y comienza una tarea.
step2 (lado del servidor): almacene la referencia del objeto taskManager en la caché para referencia futura.
step3 (lado del cliente): utilice la llamada Ajax periódica para verificar el estado de la tarea.
Básicamente, la intención es tener un marco para ejecutar una tarea en segundo plano (5 minutos aproximadamente) y proporcionar comentarios frecuentes sobre la interfaz de usuario web para el porcentaje de la tarea completada.
¿Hay alguna forma ordenada de solucionar esto o cualquier API asp.net existente que sea útil?
Editar 1 #: Quiero ejecutar la tarea en-proc con la aplicación.
Editar 2 #: Parece que la implementación de la insignia en el desbordamiento de la pila también usa la memoria caché para rastrear la tarea de fondo. http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
Microsoft Message Queue Server se creó para escenarios como el que intenta resolver: http://www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx Windows Communicatio Foundation también tiene soporte de Message Queue Server. Espero que esto ayude.
Thomas
Un enfoque para hacer esto es usar el estado de la aplicación. Cuando genera un hilo de trabajo, páselo por un ID de solicitud que genere y devuélvalo al cliente. El cliente luego pasará esa ID de solicitud al servidor en sus llamadas AJAX. El servidor luego obtendrá el estado usando la ID de solicitud desde el estado de la aplicación. (El hilo de trabajo estaría actualizando el estado de la aplicación en función de su estado).
Vi una aproximación a un problema similar en alguna parte. La solución fue algo así como:
- Inicie la tarea en segundo plano en el servidor. Vuelva inmediatamente con una url al resultado.
- Hasta que se publique el resultado, esta URL devolverá 404.
- El cliente verifica periódicamente esta url.
- El cliente lee los resultados cuando finalmente se publican.
La URL será algo así como http: // mysite / myresults / cffc6c30-d1c2-11dd-ad8b-0800200c9a66 . El mejor formato de documento es probablemente JSON.
Si la retroalimentación sobre el progreso es importante, modifique el documento para que también contenga el estado (inprogress / finish) y el progreso (42%).