Manejando hilos con la clase ThreadPool
Una parte importante de la programación hoy en día es el manejo asíncrono de algunos trabajos. Esto significa que la aplicación debe realizar diferentes actividades a la vez, una alternativa de ello se presenta con la clase ThreadPool de .Net. Esta clase permite administrar una cola de subprocesos que se ejecutarán en paralelo dependiendo de la cantidad máxima de subprocesos que soporte el ThreadPool, para entender un poco más esta parte veámos el siguiente ejemplo y luego haremos la explicación debida, esto en un proyecto de tipo Console Application.
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ThreadPoolDemo { class Program { static void Main(string[] args) { WaitCallback callback = new WaitCallback(MostrarTexto); ThreadPool.SetMaxThreads(3, 3); ThreadPool.QueueUserWorkItem(callback, "Hola mundo"); ThreadPool.QueueUserWorkItem(callback, "Probando múltiples hilos"); ThreadPool.QueueUserWorkItem(callback, "Me voy despidiendo"); ThreadPool.QueueUserWorkItem(callback, "Nos vemos luego"); ThreadPool.QueueUserWorkItem(callback, "Mejor me quedo"); Console.ReadLine(); } static void MostrarTexto(object objEstado) { //Convertimos el objeto enviado al tipo que necesitamos dentro del método string textoEnviado = (string)objEstado; Console.WriteLine("Thread: {0} - {1}", Thread.CurrentThread.ManagedThreadId, textoEnviado); } } }
Bien, primero necesito referenciar al NameSpace System.Threading que es el que maneja las clases adecuadas para el trabajo con subprocesos. Ahora, en el método Main lo primero que hacemos es definir un delegado WaitCallback, el cual define el método (que debe ser estático) que debe ser ejecutado por un subproceso. En este delegado definimos el método que queremos ejecutar, para nuestro caso: MostrarTexto. Seguidamente utilizaremos el método estático SetMaxThreads de la clase ThreadPool para definir la cantidad máxima de subprocesos que se deben ejcutar.
Ahora, para iniciar los subprocesos invocaremos al método estático QueueWorkItem de la clase ThreadPool para ejecutar nuestro método pero invocando al delegado callback que hemos definido; ahora, el método QueueWorkItem tiene una sobrecarga, en el primer caso solo acepta el delegado a ejecutar y en el segundo caso acepta además un objeto que será pasado al método como parámetro.
El resultado debe ser mas o menos como muestra la siguiente imágen:
Como se puede observar, solo hay dos subprocesos ejecutándose (los Id 6 y 10) y la ejecución de los hilos no se hace en el orden en que los hemos definido en el código. El trabajo de los subprocesos hace que se ejecute una linea de un subproceso y otra linea del otro subproceso y luego otra linea de otro subproceso y asi sucesivamente (es solo un ejemplo), el subproceso que termine primero ejecutará el método que este en la cola esperando.
El objeto que pasamos como parámetro contiene la información que se utilizará dentro del método que ejecutaremos como subproceso, en el ejemplo utilizamos un string pero en otros casos, si se requiere pasar más de un dato al método MostrarTexto podemos definir una clase y asignarle las propiedades que utilizaremos dentro del método, así podemos instanciar un objeto de dicha clase, llenar las propiedades que necesitamos y luego enviar el objeto al método, mas o menos como muestra el siguiente mini ejemplo:
Persona per = new Persona(); per.nombre = "hanz"; per.edad = 23; ThreadPool.QueueUserWorkItem(callback, per);
Espero que el ejemplo se entienda y sobretodo que les sea de utilidad.
Saludos.






Julio 28th, 2008 at 6:05 pm
es claro que podemos utilizar hilos en aplicaciones de tipo consola o en aplicaciones windows.. pero podemos hacer lo mismo con aplicaciones web?? he buscado formas y no he podido hacerlo.
Si tuvieras algun ejemplo me ayudarás muchisimo.
Saludos
Jorge