2010-10-22 6 views
7

Esto es algo así como una cuestión de hermanos this programmers question.¿Existen peligros no obvios al usar subprocesos en ASP.NET?

En pocas palabras, estamos buscando "retrotraer" adecuadamente el trabajo que ha estado respaldando las solicitudes de los usuarios en el fondo. La pregunta vinculada me ha dado muchas ideas si tomamos la ruta del servicio, pero realmente no ha proporcionado ningún argumento convincente sobre por qué, exactamente, deberíamos.

tengo que admitir que, para mí, la capacidad de hacer el equivalente moral de

WorkQueue.Push(delegate(object context) { ... }); 

es muy convincente, así que si es un poco difícil (en lugar de por sí inviable) estoy inclinado a ir con el enfoque de hilo de fondo.

Por lo tanto, los problemas con hilos de fondo yo sepa (en el contexto de un AppPool):

  • Pueden morir en cualquier momento debido a la AppPool ser reciclados
    • Solución: realizar un seguimiento cuando se está ejecutando una tarea, por lo que se puede volver a ejecutar * deberían necesitar un nuevo hilo
  • El ThreadPool se utiliza para responder a las consultas HTTP entrantes, así que usar que puede morir de hambre IIS
    • Solución: construir nuestro propio grupo de subprocesos, limitando también el número de subprocesos.

Mi pregunta es, lo que me falta, en todo caso? ¿Qué más puede salir malǂ con hilos de fondo en ASP.NET?

* La tarea en las preguntas ya es segura para volver a ejecutar, por lo que este no es un problema.
ǂ Supongamos que no estamos haciendo nada realmente estúpido, como lanzar excepciones en los hilos de fondo.

+0

no son la mayoría de los 'peligros' de enhebrado no obvios ?? –

+0

@Mitch - Estoy buscando los peculiares de ASP.NET. Esos peligros para los peatones se pueden ignorar por ahora, :) –

Respuesta

2

Un peligro que me encontré personalmente es el CallContext. Estábamos usando el CallContext para establecer los datos de identidad del usuario, porque el mismo código se compartió en nuestra aplicación web y en nuestros servicios de aplicación basados ​​en .NET Remoting (que está diseñado para usar el CallContext para almacenar datos específicos de llamada), así que no estábamos usando el HttpContext.

Notamos que, a veces, una nueva solicitud terminaría con una identidad no nula en el CallContext. En otras palabras, ASP .NET no anulaba los datos almacenados en el CallContext entre solicitudes ... y, por lo tanto, un usuario no autenticado podría ingresar a la aplicación si recogían un hilo que todavía tenía el CallContext que contenía información de identidad de usuario validada.

1

Déjenme decirles acerca de un peligro no evidente :)

utilicé hilos para recoger actualización alimenta cierta RSS en mi base de datos para un sitio web que estaba recibiendo con GoDaddy. Los hilos funcionaron bien (si se cancelaran, se reiniciarían automáticamente debido a algunos controles que había creado en algunas páginas web).

Funcionaba de manera excelente y estaba muy contento, hasta que GoDaddy (mi anfitrión) comenzó a matar los hilos y luego los bloqueó por completo. ¡Entonces mi aplicación acaba de morir!

Si eso no fue obvio, ¿qué es?

0

Podría ser que esté complicando demasiado su arquitectura sin obtener ningún beneficio.

Su programa será más costoso de escribir, más costoso de mantener y tendrá más posibilidades de tener errores.

+0

Meh, estoy dispuesto a suponer que podemos hacerlo bien, si se puede obtener desde el principio. No es como si nunca hubiera escrito un grupo de subprocesos antes, diablos Sam incluso tiene un OSS en [mediabrowser] (http://code.google.com/p/videobrowser/) (aunque no está listo para IIS, y no compatible con licencia). Además, hay beneficios: la simplicidad (al no tener que cruzar los límites del proceso) es uno de ellos. –

+1

Sí, estoy seguro de que puede hacer que funcione, pero la funcionalidad adicional justifica el trabajo adicional y la complejidad –

3

Me mantendría alejado del lanzamiento de subprocesos desde dentro de su dominio de aplicación IIS para StackOverflow. No tengo ninguna evidencia sólida que respalde lo que voy a decir, pero trabajando con IIS durante 10 años, sé que funciona mejor cuando es el único juego de la ciudad.

También hay una alternativa, sé que esto va a ser una especie de take off on my answer en el hilo de programadores. Pero, según tengo entendido, ya tienes una solución que funciona respaldando el trabajo de las solicitudes de los usuarios. ¿Por qué no usar ese código, pero solo iniciarlo cuando se llama a una API interna especial? Luego use Task Scheduler para llamar a un comando CURL que llama a esa API cada 30 segundos para iniciar las tareas. De esta forma, permite que IIS maneje el subprocesamiento y su código maneja algo que ya hace fácilmente.

Cuestiones relacionadas