C# MsgPrinterThead: Subprocesamiento múltiple

Introducción

Poder realizar varias operaciones en paralelo de o de forma concurrente es esencial en cualquier lenguaje de programación cuando construimos aplicaciones avanzadas. La biblioteca de clases de .NET framework cuenta con primitivas para el subprocesamiento mútiple. El espacio de nombres (namespace) que debemos incluir es System.Threading.

Los subprocesos transitan por varios estados durante su ciclo de vida. Dos clases básicas para el subprocesamiento del namespace System.Threading son Thread y Monitor.

thread

Un objeto Thread inicialmente está inactivo (Unstarted) cuando el programa crea el objeto (un objeto es una instancia de una clase) y pasa un delegado ThreadStart al constructor del objeto.

thread1

El delegado ThreadStart permite especificar la acción que realizará el proceso durante su ciclo de vida debe declararse como un método que no retorne (void) y sin parámetros:

thread2

El subproceso se mantiene en estado Unstarted hasta que llamamos al método Start de la clase Thread que arranca el hilo multitarea (Running). thread3

En ese momento ejecuta el método especificado por su delegado ThreadStart. Podemos forzar la parada del subproceso en cualquier momento llamando al método Abort. El método Abort lanza una excepción ThreadAbortException en el subproceso.

Primer programa con tareas concurrentes

La aplicación crea 3 hilos que imprimen un mensaje por consola antes y después de pasar por un Sleep de un número de milisegundos aleatorio para cada método.

Creamos un nuevo proyecto de consola y le damos nombre “MsgPrinterThead” por ejemplo, inicialmente antes de comenzar:

 thread4

Lo primero es incluir el espacio de nombres System.Threading.

Clase clsMsgPrinterThead

Vamos a crear una nueva clase dentro del espacio de nombres y la llamaremos “clsMsgPrinterThead”, la clase contiene dos miembros privados para contener el número aleatorio que generemos en el constructor de la clase y que será el valor empleado para pausar la ejecución del método Print llamado como subproceso.

thread5

 Ahora en el constructor generaremos un valor aleatorio entre 0 y 5000 y lo guardamos en iSleepTime.

thread6

Definimos un método que será el que se llame para cada hilo multitarea:

thread7

Ahora que ya hemos definido la clase y su método que será ejecutado de forma concurrente vamos a ver las llamadas para crear los 3 subprocesos desde el Main.

Creación de Thread-s

thread8

Código completo:

</p>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace MsgPrinterThead
{
/**
* Clase clsMsgPrinterThead
* El constructor genera un número de forma aleatoria que será usado como tiempo de inactividad del
* hilo cuando pausemos su ejecución con el método...
*/
class clsMsgPrinterThead
{
private int iSleepTime; //< Timepo inactividad cuando se pause ejecución.
private static Random myRandom = new Random(); //< Clase para genear números aleatorios.

public clsMsgPrinterThead()
{
//Tiempo de inactividad aleatorio entre 0 y 5s (5000 milisegundos)
iSleepTime = myRandom.Next(5001);
}

public void Print()
{
Thread actual = Thread.CurrentThread;
Console.WriteLine("{0} va a estar inactivo {1} miligsegundos",
actual.Name,this.iSleepTime);
Thread.Sleep(this.iSleepTime);
Console.WriteLine("{0} dejo de estar inactivo.",actual.Name);
}
}

class Program
{
static void Main(string[] args)
{
clsMsgPrinterThead Printer1 = new clsMsgPrinterThead();
Thread subproceso1 = new Thread(new ThreadStart(Printer1.Print));
subproceso1.Name = "subproceso1";

clsMsgPrinterThead Printer2 = new clsMsgPrinterThead();
Thread subproceso2 = new Thread(new ThreadStart(Printer2.Print));
subproceso2.Name = "subproceso2";

clsMsgPrinterThead Printer3 = new clsMsgPrinterThead();
Thread subproceso3 = new Thread(new ThreadStart(Printer3.Print));
subproceso3.Name = "subproceso3";

subproceso1.Start();
subproceso1.Abort();

subproceso2.Start();
subproceso3.Start();
}
}
}
<p style="text-align: justify;">
Anuncios

Un pensamiento en “C# MsgPrinterThead: Subprocesamiento múltiple

  1. Pingback: C# GuiUpdateThread: Refrescar el contenido de la ventana desde un subproceso | Internet y GNU/Linux

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s