Hilo.Start() versus ThreadPool.Lista de usuarios()


La Biblioteca de Clases Base.NET de Microsoft proporciona varias formas de crear un hilo e iniciarlo. Básicamente, la invocación es muy similar a cualquier otra que proporcione el mismo tipo de servicio: crear un objeto que represente un flujo de ejecución (o más), asignarle un delegado que represente el flujo de ejecución a ejecutar y, eventualmente, dependiendo de la firma del delegado, un objeto como parámetro.

Bueno, hay dos enfoques (esencialmente):

1) Usando el System.Threading.Thread clase.

Thread curr = new Thread(myfunction); /* In a class, myfunction is a void taking an object */
curr.Start(new Object()); /* Or something else to be downcast */

2) Usando la clase System.Threading.ThreadPool.

ThreadPool.QueueUserWorkItem(myfunction, new Object()); /* Same philosophy here */

¿Hay alguna razón especial por la que debería usar 1) o 2)?? Razones de rendimiento? Los patrones? Cuál es el mejor enfoque?

Tengo la sensación de que la respuesta es: "Depende de la situación". ¿Podría enumerar algunas situaciones en las que un enfoque es mejor que otro?

Author: Cœur, 2011-06-01

6 answers

Iniciar un nuevo hilo puede ser una operación muy costosa. El grupo de hilos reutiliza los hilos y, por lo tanto, amortiza el costo. A menos que necesite un hilo dedicado, el grupo de hilos es la forma recomendada de hacerlo. Al usar un hilo dedicado, tiene más control sobre atributos específicos del hilo, como prioridad, cultura, etc. Además, no debes realizar tareas de larga duración en el grupo de subprocesos, ya que obligará al grupo a generar subprocesos adicionales.

Además De las opciones que mencionas . NET 4 ofrece algunas abstracciones excelentes para la concurrencia. Echa un vistazo a la Tarea y las clases paralelas, así como todos los nuevos métodos PLINQ.

 45
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 20:07:59

El Grupo de Subprocesos administrado tiene algunas pautas muy buenas sobre cuándo NO usar el grupo de subprocesos.

En mi experiencia, quieres crear tu propio hilo cuando necesitas un hilo persistente, dedicado y de larga duración. Para todo lo demás, utilice delegados asíncronos o algo como QueueUserWorkItem, BackgroundWorker, o las funciones relacionadas con tareas de. NET 4.0.

 11
Author: Jim Mischel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 20:17:00

Los hilos en ThreadPool son hilos de fondo; Todos los subprocesos creados e iniciados por un nuevo objeto de subproceso son subprocesos en primer plano.

Un subproceso en segundo plano no mantiene el entorno de ejecución administrado en ejecución.

Refiérase a http://msdn.microsoft.com/en-us/library/h339syd0.aspx para más.

 7
Author: Steel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-11 05:12:46

En.NET 4.5.2 agregaron un nuevo método: HostingEnvironment.QueueBackgroundWorkItem .

Esto parece ser una alternativa a ThreadPool.QueueUserWorkItem. Ambos se comportan de manera similar, pero hay algunos beneficios agradables al usar el nuevo método cuando se trabaja en ASP.NET:

El entorno anfitrión.El método QueueBackgroundWorkItem te permite programe pequeños elementos de trabajo en segundo plano. ASP.NET rastrea estos elementos y evita que IIS termine abruptamente el proceso de trabajo hasta que todos fondo los elementos de trabajo se han completado. Este método no se puede llamar fuera de un ASP.NET dominio de aplicación administrado.

 5
Author: dana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-14 00:00:59

Usando el ThreadPool, usted tiene menos control del sistema de threading. Este es un intercambio para simplificar el proceso para usted. Si usted tiene todo lo que necesita de la ThreadPool, usted debe sentirse libre de utilizarlo. Si necesita más control de los subprocesos, entonces necesita, por supuesto, usar las clases de subprocesos.

 2
Author: Bueller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 20:07:42

ThreadPool.QueueUserWorkItem () es básicamente para escenarios de fuego y olvido, cuando la aplicación no depende de si las operaciones terminarán o no.

Utilice hilos clásicos para el control de grano fino.

 1
Author: Tomas Voracek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 20:13:31