Wpf - Crear y lanzar un hilo

Descripción general

Este articulo analiza las formas básicas de crear y lanzar un hilo

[TOC] Tabla de Contenidos


↑↑↑

Introducción

Los hilos no se crean inmediatamente, sino que las solicitudes de hilos, se colocan en una cola, y el Runtime de .NET decide cuando crear los hilos.

Los primeros hilos se crean casi inmediatamente pero la velocidad a la que se crean hilos posteriores depende de la ejecución de los distintos subprocesos que se están ejecutando.

.NET ofrece varias implementaciones de Hilos que pueden dividirse en dos categorías:


↑↑↑

Implementación de los Hilos

Existen cuatro (4) formas de crear hilos, de añadir paralelismo y concurrencia a las aplicaciones


↑↑↑

Ejemplos

A continuación se muestra un ejemplo sencillo con la implementación de cada una de ellas


↑↑↑

Invocación asíncrona (Asynchronous Invoke)

Public Class InvocacionAsincrona

    Public Delegate Sub DelegadoSimuladorTrabajo()

    Public Sub CrearHiloConInvocacionAsincrona()

        ' Crear una instancia del delegado.  
        Dim msd As DelegadoSimuladorTrabajo = AddressOf TrabajoSimulado

        ' A) llamada síncrona
        Debug.WriteLine("[llamador] (1) llamada síncrona")
        msd.Invoke()
        Debug.WriteLine("[llamador] (1) /Eof llamada síncrona")

        ' B) llamada asíncrona
        Debug.WriteLine("[llamador] (2) llamada asíncrona")
        msd.BeginInvoke(Nothing, Nothing)
        Debug.WriteLine("[llamador] (2) /Eof llamada asíncrona")

        '------------------------------------
        ' Resultado de esta función
        '------------------------------------
        '[llamador](1) llamada síncrona
        '[Hilo] Inicio procedimiento
        '[Hilo] Final procedimiento
        '[llamador](1) /Eof llamada síncrona
        '
        '[llamador](2) llamada asíncrona
        '[llamador](2) /Eof llamada asíncrona
        '[Hilo] Inicio procedimiento
        '[Hilo] Final procedimiento

    End Sub


    Public Sub TrabajoSimulado()
        Debug.WriteLine("[Hilo] Inicio procedimiento")
        System.Threading.Thread.Sleep(1000)
        Debug.WriteLine("[Hilo] Final procedimiento")
    End Sub

End Class

↑↑↑

Hilos explícitos (Explicit Threading)

Public Class ThreadingExplícita

    Public Sub CreateThread_ExplicitThreading()
        '------------------------------------------------
        ' código refactorizado y simplificado
        'Dim MyThread As System.Threading.Thread = Nothing
        'MyThread = New System.Threading.Thread(AddressOf TrabajoSimulado)
        'MyThread.Start()
        '/Eof refactorización
        '------------------------------------------------

        ' llamada asíncrona
        Debug.WriteLine("[llamador] (1) MyThread.Start")
        Call New System.Threading.Thread(AddressOf TrabajoSimulado).Start()
        Debug.WriteLine("[llamador] (1) /Eof MyThread.Start")


        '------------------------------------
        ' Resultado de esta función
        '------------------------------------
        '[llamador](1) MyThread.Start
        '[llamador](1) /Eof MyThread.Start
        '[Hilo] Inicio procedimiento
        '[Hilo] Final procedimiento
    End Sub


    Public Sub TrabajoSimulado()
        Debug.WriteLine("[Hilo] Inicio procedimiento")
        System.Threading.Thread.Sleep(1000)
        Debug.WriteLine("[Hilo] Final procedimiento")
    End Sub

    '    ' Bibliografia
    'Threading - Under the Hood
    'https://www.codeproject.com/Articles/1176173/Threading-Under-the-Hood

End Class

↑↑↑

Biblioteca de procesamiento paralelo (Task Parallel Library (TPL))

Public Class TaskParallelLibrary

    Public Sub CreateThread_TaskParallelLibrary()


        Debug.WriteLine("[llamador] (1) TaskParallelLibrary")

        Dim tarea As System.Threading.Tasks.Task
        tarea = Task.Factory.StartNew(Sub()
                                          Call TrabajoSimulado()
                                      End Sub)

        ''-------------------------------------------------------------
        '' forma alternativa de lanzar el hilo
        'Call System.Threading.Tasks.Task.Factory.StartNew(Sub()
        '                                                      Call TrabajoSimulado()
        '                                                  End Sub)
        ''-------------------------------------------------------------
        Debug.WriteLine("[llamador] (1) /Eof TaskParallelLibrary")


        '------------------------------------
        ' Resultado de esta función
        '------------------------------------
        '[llamador](1) TaskParallelLibrary
        '[llamador](1) /Eof TaskParallelLibrary
        '[Hilo] Inicio procedimiento
        '[Hilo] Final procedimiento
    End Sub


    Public Sub TrabajoSimulado()
        Debug.WriteLine("[Hilo] Inicio procedimiento")
        System.Threading.Thread.Sleep(1000)
        Debug.WriteLine("[Hilo] Final procedimiento")
    End Sub


End Class

↑↑↑

Grupo de subprocesos (Thread Pool)


Public Class GrupoDeSubprocesos

    Public Sub CreateThread_ThreadPool()

        Debug.WriteLine("[llamador] (1) ThreadPool")
        'la información que se pasa al hilo ( en este caso NULL)
        Dim stateInfo As Object = Nothing
        ' la cola
        System.Threading.ThreadPool.QueueUserWorkItem(AddressOf TrabajoSimulado, stateInfo)

        Debug.WriteLine("[llamador] (1) /Eof ThreadPool")
        '------------------------------------
        ' Resultado de esta función
        '------------------------------------
        '[llamador](1) ThreadPool
        '[llamador](1) /Eof ThreadPool
        '[Hilo] Inicio procedimiento thread pool
        '[Hilo] Final procedimiento  thread pool

    End Sub


    Public Sub TrabajoSimulado(stateInfo As Object)
        ' No se pasó ningún objeto de estado a QueueUserWorkItem, por lo que stateInfo es null.
        Debug.WriteLine("[Hilo] Inicio procedimiento thread pool")
        System.Threading.Thread.Sleep(1000)
        Debug.WriteLine("[Hilo] Final procedimiento  thread pool")
    End Sub


End Class

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]