21 julio, 2007

Threading

Todo desarrollador que se preocupe por el rendimiento de las aplicaciones que implementa debe conocer sobre el desarrollo con múltiples hijos (threads). El namespace system.threading contiene lo necesario para crear y administrar el multi-hilo de una aplicación.

Para crear un thread es necesario seguir los siguientes pasos:

  • Crear un método sin argumentos y que no retorne datos.
  • Crear un ThreadStart delegate que haga referencia al método creado en el paso anterior
  • Crear un objeto Thread que haga referencia al ThreadStart delegate anterior.
  • Invocar al thread.start para iniciar la ejecución del nuevo hilo.

Veamos un ejemplo de cómo crear un thread que despliega una línea de texto en la consola.

Imports System.threading

Module Module1

Sub DespliegaMensaje()

Console.WriteLine("Mensaje, generado por el hilo: {0}", Thread.CurrentThread.ManagedThreadId)

End Sub

Sub Main()

Dim metodo_a_ejecutar As New ThreadStart(AddressOf DespliegaMensaje)

Dim NuevoHilo As New Thread(metodo_a_ejecutar)

NuevoHilo.Start()

Console.ReadKey()

NuevoHilo.Abort()

End Sub

End Module

Ahora veamos un ejemplo con varios threads

Imports System.threading

Module Module1

Sub DespliegaMensaje()

For i As Integer = 1 To 5

Console.WriteLine("Mensaje, generado por el hilo: {0}", Thread.CurrentThread.ManagedThreadId)

Next

End Sub

Sub Main()

Dim metodo_a_ejecutar As New ThreadStart(AddressOf DespliegaMensaje)

Dim hilos(5) As Thread

For i As Integer = 1 To 5

hilos(i) = New Thread(metodo_a_ejecutar)

hilos(i).Start()

Next

Console.ReadKey()

For i As Integer = 1 To 5

hilos(i).Abort()

Next

End Sub

End Module

En algunas ocasiones es necesario esperar que alguno de los hilos finalice para proseguir con la ejecución de nuestro código, para esto utilizamos el método join:

Hilo.Join()

También podemos controlar la prioridad de cada hilo, esto lo hacemos con el método priority utilizando el enumerado ThreadPriority.

Highest

La más alta prioridad

AboveNormal

Alta prioridad

Normal

Prioridad normal

BelowNormal

Prioridad baja

Lowest

La más baja prioridad

3 comentarios:

Ricardo Jimenez dijo...

Alejandro te queremos desear lo mejor en tu blog. Que tu conocimiento le ayude a muchos desarrolladores a ser mejores profesionales. Mucha suerte y felicidades por la iniciativa!

Ricardo Jimenez, Microsoft.

Anónimo dijo...

Alejandro me gusta tu aporte, sin embargo tengo una duda con respecto a los hilos, de que manera son aplicables... en que tipo de programas o posibles problemas se podrían utilizar.

Arturo, San Carlos

Alejandro Soto Madrigal dijo...

Muchas gracias Arturo, los threads realmente son de utilidad casi en cualquier aplicación, en la actualidad casi todas las máquinas tienen más de un "core" o procesador, por lo tanto pueden procesar a más de un hilo a la vez.
Si en la aplicación a desarrollar hay algún proceso de cálculo intensivo que se puede dividir en partes, o si requiere esperar algún evento cliente y no desea dejar la aplicación "congelada" se pueden usar threads.
Sin embargo, hay que tener en consideración que las aplicaciones multi-threads son más difíciles de depurar (debuging)