Cómo usar subprocesos múltiples con tareas en C #

El término de programación de computadora "hilo" es la abreviatura de hilo de ejecución, en el que un procesador sigue una ruta específica a través de su código. El concepto de seguir más de un hilo a la vez introduce el tema de multitarea y multihilo.

Una aplicación tiene uno o más procesos en ella. Piense en un proceso como un programa que se ejecuta en su computadora. Ahora cada proceso tiene uno o más hilos. Una aplicación de juego puede tener un hilo para cargar recursos desde el disco, otra para hacer IA y otra para ejecutar el juego como servidor.

En .NET / Windows, el sistema operativo asigna el tiempo del procesador a un subproceso. Cada hilo realiza un seguimiento de los controladores de excepciones y la prioridad en la que se ejecuta, y tiene un lugar para guardar el contexto del hilo hasta que se ejecute. El contexto del subproceso es la información que necesita reanudar el subproceso.

Multitarea con hilos

Los subprocesos ocupan un poco de memoria y crearlos lleva un poco de tiempo, por lo que, por lo general, no desea utilizar muchos. Recuerde, compiten por el tiempo de procesador. Si su computadora tiene varias CPU, entonces Windows o .NET pueden ejecutar cada subproceso en una CPU diferente, pero si varios subprocesos se ejecutan en la misma CPU, solo uno puede estar activo a la vez y cambiar los subprocesos lleva tiempo.

La CPU ejecuta un subproceso por unos pocos millones de instrucciones y luego cambia a otro subproceso. Todos los registros de la CPU, el punto de ejecución del programa actual y la pila deben guardarse en algún lugar para el primer subproceso y luego restaurarse desde otro lugar para el siguiente subproceso.

Crear un hilo

En el espacio de nombres Sistema. Enhebrar, encontrará el tipo de hilo. El hilo del constructor (ThreadStart) crea una instancia de un hilo. Sin embargo, en el código reciente de C #, es más probable que pase una expresión lambda que llame al método con cualquier parámetro.

Si no está seguro acerca de las expresiones lambda, puede valer la pena echarle un vistazo a LINQ.

Aquí hay un ejemplo de un hilo que se crea y se inicia:

utilizando el sistema;
usando System.Threading;
espacio de nombres ex1

Programa de clase

público estático vacío Write1 ()

Console.Write ('1');
Hilo Dormir (500);

vacío estático Main (string [] args)

var task = nuevo hilo (Write1);
task.Start ();
para (var i = 0; i < 10; i++)

Console.Write ('0');
Console.Write (task.IsAlive? 'A': 'D');
Hilo Dormir (150);

Console.ReadKey ();


Todo lo que hace este ejemplo es escribir "1" en la consola. El hilo principal escribe un "0" en la consola 10 veces, cada vez seguido de una "A" o "D" dependiendo de si el otro hilo sigue vivo o muerto.

El otro hilo solo se ejecuta una vez y escribe un "1". Después del retraso de medio segundo en el hilo Write1 (), el hilo termina y el Task.IsAlive en el bucle principal ahora devuelve "D".

Grupo de subprocesos y biblioteca paralela de tareas

En lugar de crear su propio hilo, a menos que realmente necesite hacerlo, utilice un conjunto de hilos. Desde .NET 4.0, tenemos acceso a la Biblioteca Paralela de Tareas (TPL). Como en el ejemplo anterior, nuevamente necesitamos un poco de LINQ, y sí, son todas expresiones lambda.

Tareas utiliza el conjunto de subprocesos detrás de escena, pero hace un mejor uso de los subprocesos dependiendo del número en uso.

El objeto principal en el TPL es una tarea. Esta es una clase que representa una operación asincrónica. La forma más común de comenzar a ejecutar cosas es con Task.Factory.StartNew como en: