Tenemos algunos procesos comerciales de larga ejecución que se inician a través de Servicios WCF que se ejecutan en IIS (modo integrado) en WS 2008 R2. Estos procesos comerciales suelen implicar mucha interacción con nuestro servidor SQL Server. Hemos creado una implementación de cola de tareas personalizada mediante la cual las solicitudes se ponen en cola a través de una llamada de servicio inicial y luego se ejecutan según la prioridad. Esta ejecución puede tardar en completarse (20-30 minutos en extremo). Los clientes pueden consultar el servidor para el progreso de sus propias tareas en segundo plano.ThreadPools vs Own Threads para procesos de larga ejecución
En nuestra implementación actual, las tareas se activan en un subproceso independiente para ejecutar y no desde el ThreadPool. Esto se realizó debido a reading recommendations de no ejecutar tareas de ejecución prolongada utilizando ThreadPool para evitar que las peticiones de ASP.NET se agotaran. Controlamos la cantidad de subprocesos generados al colocar un límite superior en la cantidad de tareas en segundo plano que se pueden ejecutar al mismo tiempo. De esta forma tratamos de controlar la carga en la CPU y evitar demasiada conmutación de contexto de hilo. Mientras todo esto sucede, por supuesto, todavía necesitamos atender las solicitudes "en línea" normales para la aplicación también.
Después de leer this post por Thomas Marquardt Me preocupa el hecho de que no estamos utilizando el ThreadPool ya que no obtendremos el beneficio de la heurística de ajuste incorporada en él. Ya solucionamos el problema de cierre que menciona Thomas conectándose al evento ApplicationEnd y cancelando las tareas de ejecución prolongada. Entonces mi pregunta es, ¿deberíamos cambiar al uso de ThreadPool? ¿Qué hay de estos hilos atados por largos períodos de tiempo? Si entiendo a Thomas correctamente, él está diciendo que esto no importa ya que el ThreadPool se sintonizará para crear más solicitudes para atender las operaciones normales en línea. También he leído this StackOverflow question que cubre los mismos motivos, pero todavía no estoy seguro del camino a seguir.
Elabore: ¿qué afinación específica cree que se puede estar perdiendo? –
Tal vez "sintonizar" no era la palabra correcta para usar, pero me refería al hecho de que si las tareas en segundo plano se ejecutaban usando subprocesos ThreadPool, el ThreadPool "estaría en línea" con la "carga" adicional que se coloca en el sistema por las tareas de fondo. Si los ejecutamos con Threads normales, ThreadPool no tiene este conocimiento. Una vez más, no tengo los detalles internos de cómo funciona la heurística ThreadPool con precisión, pero al leer el post de Thomas, surgió la preocupación de mi parte de que estamos dando un paso al costado de esta lógica de "ajuste" integrada en el ThreadPool al ejecutarla -Hilos de THreadPool – Carel