Hilos en C#

etSq-1Saludos en esta entrada les hablare sobre los hilos en C#:

  •  Que son ?
  • Como funciona.
  •  Cuando usarlos.

Si somos nuevos en la programación o estamos aprendiendo C# debemos saber que, C# soporta la ejecución paralela de código a través de múltiples hilos.

Pero que es un hilo ?

Un hilo es una ruta independiente de ejecución, capaz de ejecutarse simultáneamente con otros hilos, es decir que podemos ejecutar cuantos hilos sean necesarios para realizar nuestra tarea.

Debemos tener claro que un programa C#, arranca en un hilo principal creado automáticamente por el CLR y el sistema operativo y puede estar compuesto de múltiples subprocesos mediante la creación de hilos adicionales.

Nota:El CLR es un entorno de ejecución para los códigos de los programas que corren
 sobre la plataforma Microsoft .NET. El CLR es el encargado de compilar una forma 
de código intermedio llamada Common Intermediate Language 
(CIL, anteriormente conocido como MSIL, por Microsoft Intermediate Language), 
al código de maquina nativo, mediante un compilador en tiempo de ejecución. 

Como funciona

Los hilos son manejados internamente por un programador o “gestor” de hilos, una función que el CLR típicamente delega en el sistema operativo.

Un programador de hilos asegura que a todos los hilos se les asigna un tiempo de ejecución apropiado y que todos aquellos hilos que estén bloqueados o pausados no consuman tiempo de CPU. En un ordenador con un solo procesador, un programador de hilos gestiona una alternancia rápida entre los hilos activos, derivando en un comportamiento entrecortado. Desde Windows XP, la asignación de tiempo para cada hilo está en el orden de las decenas de mili-segundos.

Donde se encuentran ?

Todos los hilos dentro de una aplicación están dentro de un proceso. Pero no confundamos un Hilo con un Proceso, la diferencia entre estos es que  los procesos están completamente aislados unos de otros, mientras que los hilos no, estos tienen la cualidad de  compartir memoria con otros hilos que pertenecen al mismo proceso, es decir que un hilo puede estar generando datos en un segundo plano mientras que otro hilo muestra los datos que van llegando.

¿Cuándo usar hilos?

Normalmente se utilizan para realizar trabajos en un segundo plano que vayan a consumir mucho tiempo hasta que se completen, por ejemplo, operaciones masivas con bases de datos, operaciones de cálculo, reportes…, mientras que la interfaz de usuario queda libre para que el usuario pueda trabajar en otra cosa aumentando la productividad.

De otra manera, ésta no respondería, se vería bloqueada,es decir le saldría la coqueta literatura no responde en la aplicación que se este ejecutando , esto  aumentaría la insatisfacción del usuario. También es posible que desde dicha interfaz pueda ofrecerse al usuario la posibilidad de cancelar este tipo de operaciones u ofrecer incluso información acerca del estado o porcentaje de operación completado. Una clase que puede resultar muy útil para este tipo de situaciones es la clase BackGroundWorker.

No todo son ventajas manejando hilos.

La interacción entre hilos puede ser compleja y sin son usados en exceso o inadecuado, conllevan una penalización en el rendimiento de la CPU, así que cuidadin con el manejo de hilos.

Ahora viene la DEMO !!

Abrimos Visual Studio -> Creamos un nuevo proyecto C# consola.

a1

Manos al código, lo primero que haremos es crear una clase en mi caso yo la nombre tasks y escribiremos el siguiente código.

a2

Este es el código de la clase:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace hilos
{
    class tasks
    {
        private String name;
        private int time;
        // estos son los atributos de la clase

        //este es el metodo constructor, debe llamarse igual que la clase

        public tasks(String name, int time)
        {
            this.name = name; // el dato que este en el parametro name se lo vamos a almacenar a el atributo
            this.time = time;
            // de esta forma quedan inicializados los artibutos

        }
        //creamos un nuevo metodo
        public void tasks1()
        {
            Console.WriteLine(name +"Este hilo solo durara"+ time+"segundos"); // mensaje que saldra en consola

            Thread.Sleep(time * 1000); //aqui como dijimos en la teoria estamos calculando en base a milisegundos, asi que determinanos que tiempo tomara el hilo
            // tambien es el tiempo que se suspendera el subproceso actual hasta que se termine

            Console.WriteLine("Hilo terminado "+ name); // mensaje para saber cuando termino el hilo

        }
        //aca solo copie y pegue para tener dos hilos
        public void tasks2()
        {
            Console.WriteLine(name + "Este hilo solo durara" + time + "segundos"); // mensaje que saldra en consola

            Thread.Sleep(time * 1000); //aqui como dijimos en la teoria estamos calculando en base a milisegundos, asi que determinanos que tiempo tomara el hilo
            // tambien es el tiempo que se suspendera el subproceso actual hasta que se termine

            Console.WriteLine("Hilo terminado " + name); // mensaje para saber cuando termino el hilo

        }
    }
}

En el program.cs tendremos el siguiente codigo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace hilos
{
    class Program
    {
        static void Main(string[] args)
        {
            tasks objeto1 = new tasks("hilo-1", 16); // a la clase tarea le estamos pasando los datos nombre y tiempo
            tasks objeto2 = new tasks("hilo-2", 24);

            Thread hilo1 = new Thread(objeto1.tasks1);// de esta forma llamamos a los metodos que tenemos en la clase tarea
            Thread hilo2 = new Thread(objeto2.tasks2);

            //para iniciar estos dos procesos o hilos
            hilo1.Start();
            hilo2.Start();
            Console.ReadKey(); //con esto estatodo listo para ejecutar nuestros hilos de la clase tasks
        }
    }
}

Este seria la consola de salida con el resultado:

a3

Resumen

El DEMO que realizamos ejecutaba dos hilos al mismo tiempo y notifico cuando se terminaron de realizar, optimizando y automatizando las tareas y experiencia de usuario, genial no, en una próxima entrega haremos hilos que se ejecuten luego que otro termine.

Si conoces algo que no se trato en la entrada o quieres agregar algo no dudes en comentar, compártelo con tus amigos 🙂 !!!

 

Comments

4s comentarios

  1. Hola amigo en la parte de la clase Tasks, en que nos ayuda la creación de dos métodos task1-2, he estado jugando un poco en el código y pues no le veo diferencias a hacerlo con un solo método task1

    1. Saludos muy bien, como indicas se podría hacer con el task1, pero recuerda que este es un articulo tutorial didáctico y trato de hacer el código lo mas simple y entendible a primera vista ! Gracias por leerme comparte con tus amigos

  2. Saludos,
    He visto que la clase Task es aparentemente más “nueva” y al parecer mucho más eficiente que objetos como el Thread o el BackGroundworker al que incluso ví que lo etiquetaron en algún portal como “engendro”.
    Esta diversidad permite abordar un problema de paralelismo desde diferentes perspectivas y con diferentes objetos o clases por así decirlo, ¿crees tú que la clase Task viene digamos a resolver de forma más eficiente algunas carencias de objetos con propósito similar para resolver el tema del paralelismo?

Dejar una contestacion

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *