Este articulo analiza las formas básicas de crear y lanzar un hilo
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:
Existen cuatro (4) formas de crear hilos, de añadir paralelismo y concurrencia a las aplicaciones
A continuación se muestra un ejemplo sencillo con la implementación de cada una de ellas
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
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
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
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
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |