2011-02-15 10 views
5

Me encanta ThreadPool. Me hace la vida mejor. Sin embargo, mi amor puede haberse convertido en una relación abusiva de la que necesito escapar, así que necesito algunos consejos de mis hermanos SO (y presumiblemente hermanas, aunque todavía no he visto ninguna evidencia real de eso).¿Puedo particionar el C# System.Threading.ThreadPool?

Mi problema básico es que tengo varias bibliotecas diferentes que están usando threadpool de forma no coordinada, y la posibilidad de quedarse sin hilos es posible. Esperaba que hubiera alguna manera de dividir el ThreadPool para poder dar un determinado hilo de clase 1, otros 20 hilos, otros 5 hilos, etc.

Sé que podría escribir mi propia implementación de ThreadPool. No quiero hacer eso, porque soy flojo. Entonces, ¿hay una solución simple ya disponible?

Actualmente estoy obligado a utilizar el 3.5 CLR. Sé que muchas de estas cosas se vuelven más fáciles en 4.0.

Respuesta

3

No, desafortunadamente no. Es uno de mis errores con el grupo de subprocesos de .NET también. Incluso en .NET 4 con Parallel Extensions, generalmente se basa en un solo grupo de subprocesos del sistema: debería trabajar para crear sus propios grupos de subprocesos individuales (y alimentarlos en tareas como un planificador de tareas, o algo similar).

Sospecho MS ha investigado esto y han encontrado que la mayoría clientes son encontró con un único grupo de subprocesos - pero estoy de acuerdo que sería bueno tener un poco más de flexibilidad aquí ...

+0

One J.Skeet ha escrito un grupo de subprocesos configurables en [MiscUtils] (http://www.yoda.arachsys.com/csharp/miscutil/), una biblioteca de utilidades. – Ani

+1

@Ani: Sí, pero ese es un código muy antiguo, mal probado y casi con seguridad con varios defectos. No lo eliminaré de MiscUtil, pero no voy a promocionarlo en ningún lado. Esperemos que se haya implementado mejor en otro lugar :) –

+0

Encontré SmartThreadPool unos minutos después de hacer esta pregunta. Parece que mi mejor opción sería comenzar a usar eso. Me gusta especialmente que las excepciones se devuelvan a la persona que llamó originalmente; esa característica sola probablemente sea suficiente para hacer que sea preferible a System.Threading.ThreadPool. –

0

No reescribir tu propio ThreadPool.

¿Por qué no utiliza simplemente un Adapter Pattern para implementar realmente la lógica que necesita?

+1

¿Cómo ayuda el patrón de adaptador aquí? –

+0

Quizás no haya un patrón de adaptador ... La idea es que su adaptador reenvíe todas las llamadas al grupo de subprocesos después de filtrar por clase de llamante. Tal vez un patrón Brige? –

+0

Una vez más, no puedo ver cómo eso ayuda. No puede limitar fácilmente los hilos por grupo sin básicamente escribir un grupo usted mismo. –

0

Mi comprensión basada en artículos de MSDN es que el grupo de subprocesos está pensado para hilos de corta duración. La idea general del grupo de subprocesos es crear nuevos subprocesos de kernel con muchos sobrecargas, por lo tanto, cree un subproceso de kernel y deje que ese subproceso funcione en una cosa, luego pase a la siguiente.

Si tiene subprocesos de ejecución larga en el grupo de subprocesos, debe moverlos a los subprocesos normales.

Si te estás "quedando sin hilos", se están ejecutando demasiado tiempo.

+0

Abuse el threadpool, y no hago ningún comentario al respecto. Dicho esto, es perfectamente posible que una aplicación de alta concurrencia (piense en el servidor web) use el hilo de manera adecuada y aún se agote. –

Cuestiones relacionadas