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