martes, 8 de diciembre de 2015

Hilos con C# (Threads)

Las computadoras actuales manejan varios núcleos y capacidad de ejecución de tareas separadas en su propio proceso, con su propia memoria virtual, como si se tuvieran varios CPU en el equipo. Una forma de aprovechar estos núcleos  y sus procesos es el manejo de hilos. Los hilos son manejados por Windows, quien se asegura de que trabajen de forma organizada.

Cada hilo es autorizado por Windows para ejecutarse durante cierto periodo de tiempo. Después de este tiempo Windows cambia a otro hilo, esto se conoce como context switching.

Esto significa que Windows debe manejar el contexto completo de cada hilo , salvarlo y restaurarlo cada vez que cambia entre hilos. El uso de hilos asegura que cada proceso toma su tiempo sin esperar hasta que otras operaciones terminen, esto mejora lo que en ingles se escribe como responsiveness.

Responsiveness significa que la aplicación sigue accesible al usuario y le permite responder a las acciones que este ejecuta, creando la ilusión de que el CPU puede ejecutar múltiples tareas al mismo tiempo, esto es conocido como paralelismo, es decir, ejecutar múltiples hilos. Windows se asegura que los hilos son distribuidos entre todos los núcleos disponibles, lo que mejora la escalabilidad.

La sobrecarga de trabajo de Windows asociada a la administración de los hilos debe ser tomada en cuenta para determinar el uso de multi-hilos. Si desea manejar escalabilidad y accesibilidad (responsiveness ) en la aplicación,  C# con el NET Framework  le proporciona un conjunto de opciones.

Uso de la clase Thread

El espacio de nombres System.Threading contiene a la clase Thread. Esta clase permite crear los hilos, manejar la prioridad y estatus de estos.

La clase Thread no es algo que deba usarse a la ligera, y solo en caso de necesidades especiales. Al usar la clase Thread tiene control sobre todas las opciones de configuración, como la prioridad para ejecutarse por una gran cantidad de tiempo o configurar opciones avanzadas.

En el siguiente ejemplo se puede observar el uso de la clase Thread para ejecutar un método en otro hilo, aparte del principal. La clase Console sincroniza el uso del flujo de datos (stream) a la salida  (I/O) del equipo desde múltiples hilos. La sincronización es el mecanismo que aseguran que dos hilos no ejecutan una misma parte de su programa al mismo tiempo. 

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

namespace CreandoHilosConThread
{
    class Program
    {

        public static void MetodoLlamadoPorHilo()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Llamada al metodo MetodoLlamadoPorHilo no: {0}", i);
                // vea la nota en Main
                Thread.Sleep(0);
            }
        }

        static void Main(string[] args)
        {
            Thread t = new Thread(new ThreadStart(MetodoLlamadoPorHilo));
            t.Start();

            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine("Hilo principal: ");
                // Thread.Sleep(0) Es usado para señalar a Windows que 
                // el hilo a terminado. En vez de esperar el tiempo 
                // completo asignado por Windows, lo que permite
                // cambiar de inmediato a otro hilo.
                Thread.Sleep(0);
            }

            // El método Join() es llamado y usado por el hilo principal
            // para permitir a éste, esperar hasta que el otro hilo
            // termine.
            t.Join();
        }
    }
}


Referencias:
Exam Ref 70-483 Programming en C#, pag. 5.


No hay comentarios.:

Publicar un comentario