2009-06-29 13 views

Respuesta

19

El threadpool es generalmente adecuado para tareas de ejecución corta. Tiene la limitación de que es un recurso limitado para toda la aplicación (25 por CPU), y hay muchas clases internas que usan el threadpoool, por lo que si realiza muchas tareas de larga ejecución, utilizará todos los hilos.

Para las tareas de larga ejecución, es mejor utilizar una secuencia creada manualmente, con su propiedad de fondo establecida en verdadero.

Nota: En la versión de .NET Framework 2.0, el valor Thread.CurrentPrincipal propiedad se propaga a subprocesos de trabajo en cola usando el método QueueUserWorkItem. En versiones anteriores, la información principal no se propaga.

Cuándo no utilizar subproceso del grupo de subprocesos

Hay varios escenarios en los que es apropiado para crear y gestionar sus propios hilos en lugar de utilizar hilos de grupo de subprocesos:

  • necesita una hilo de primer plano (!).

  • Necesita un hilo para tener una prioridad particular.

  • Tiene tareas que hacen que el hilo se bloquee durante largos periodos de tiempo. El grupo de subprocesos tiene un número máximo de subprocesos, por lo que una gran cantidad de subprocesos de grupo de subprocesos bloqueados podría impedir el inicio de tareas.

  • Debe colocar hilos en un apartamento de un solo hilo. Todos los hilos ThreadPool están en el apartamento multiproceso.

  • Necesita tener una identidad estable asociada con el hilo o dedicar un hilo a una tarea.

Una gran diferencia es que las excepciones no controladas en las discusiones del grupo de subprocesos por terminado el proceso; con estas tres excepciones:

  • Un ThreadAbortException se lanza en un hilo de rosca de la piscina, ya que fue llamado Abort.

  • Se arroja un AppDomainUnloadedException en una cadena de subprocesos porque el dominio de la aplicación se está descargando.

  • El tiempo de ejecución de idioma común o un proceso de host finaliza el subproceso.

Algunas buenas referencias son:

The Managed Thread Pool

Threading in C#

Programming the Thread Pool in the .NET Framework

actualización: en respuesta a los comentarios. Puede usar el método GetAvailableThreads para determinar la cantidad real de subprocesos en el grupo de subprocesos en un momento determinado. ThreadPool.GetMaxThreads es una cantidad diferente. Es el máximo permitido en el grupo antes de que las solicitudes estén en cola, no la cantidad real de subprocesos actualmente en el grupo.

+0

De acuerdo con la documentación de la piscina mantiene 250 subprocesos de trabajo por procesador por defecto. –

+0

Algunas tareas de ejecución prolongada pueden necesitar que la propiedad de fondo se establezca en falso si desea asegurarse de que el hilo termine su trabajo antes de que se cierre la aplicación (por supuesto, esto no garantiza que al menos no se cierre en circunstancias normales)) – JoshBerke

+0

@Fredrik Mörk: eso suena como un error tipográfico. Es 25 por núcleo –

0

Un subproceso de subprocesos crea subprocesos y assigsn trabaja en un subproceso libre. De esta forma, la creación y eliminación de subprocesos para cada elemento de trabajo es preventiva, ya que la creación y eliminación de subprocesos es una operación relativamente costosa.

3

El ThreadPool tiene varios subprocesos que están listos para su uso, lo que puede eliminar el costo de crear nuevos subprocesos, que es lo que sucede cuando se crea un subproceso normal.

7

La diferencia no está entre los hilos en sí mismos, ya que se comportarán de la misma manera, la diferencia radica en quién gestiona la vida útil de un hilo y cómo los usa.

El grupo de subprocesos en .net es un conjunto de subprocesos que aumentará o disminuirá, cuando haga cola para que el grupo de subprocesos lo procese, determinará si es necesario iniciar un nuevo subproceso o reutilizar uno existente. No tiene que crear hilos explícitamente.

Esto es bueno, pero la desventaja de esto es que hay un número limitado de subprocesos disponibles en el grupo de subprocesos, por lo que si pone en cola una tarea larga, esto podría tener un impacto negativo en su aplicación, ya que podría estar usando una subproceso de subprocesos que otra cosa podría querer usar.

ver este article sobre el grupo de subprocesos

Cuestiones relacionadas