using System;
using System.Threading;
namespace Recetas.CSharp.Cap04.R0406
{
class DatosThreadStart
{
// Campos y propiedades:
private readonly int iteraciones;
private readonly string mensaje;
private readonly int retraso;
public int Iteraciones
{
get
{
return iteraciones;
}
}
public string Mensaje
{
get
{
return mensaje;
}
}
public int Retraso
{
get
{
return retraso;
}
}
// constructor:
public DatosThreadStart (int iteraciones, string mensaje, int retraso)
{
this.iteraciones = iteraciones;
this.mensaje = mensaje;
this.retraso = retraso;
}
}
public sealed class MetodoEnNuevoThread
{
public static void Main()
{
// Crea un nuevo Thread para ejecutar el método
// MostrarMensaje:
Thread threadNuevo = new Thread(
new ParameterizedThreadStart ( MostrarMensaje)
);
// Este thread se ejecuta en primer plano:
threadNuevo.IsBackground = false;
// Creación de instancia DatosThreadStart para
// configuración del nuevo thread:
DatosThreadStart configuracion =
new DatosThreadStart (5, "Thread nuevo en ejecución.", 500);
VisorMensajesThread ("Inicio de un nuevo thread.");
// Inicia la ejecución del nuevo thread:
threadNuevo.Start (configuracion);
// Main continua con otras tareas:
for (int i = 0; i < 13; ++i)
{
VisorMensajesThread ("El thread Main continua su ejecución.");
Thread.Sleep (200);
}
Console.WriteLine ("\nLa ejecución de Main ha terminado. Presione Enter.");
Console.ReadLine ();
}
// Este método presenta información en pantalla
// de acuerdo a la configuración de ejecución
// representada en un objeto de clase DatosThreadStart:
private static void MostrarMensaje(object configuracion)
{
DatosThreadStart datos = configuracion as DatosThreadStart;
if (datos != null)
{
for (int i = 0; i < datos.Iteraciones; ++i)
{
VisorMensajesThread(datos.Mensaje);
// Suspende (pausa) el thread por un período específico:
Thread.Sleep (datos.Retraso);
}
}
}
// Método para la visualización de información
// del estado actual de un thread:
private static void VisorMensajesThread(string mensaje)
{
Console.WriteLine ("[{0,3}] - {1} : {2}",
Thread.CurrentThread.ManagedThreadId,
DateTime.Now.ToString ("HH:mm:ss.ffff"), mensaje);
}
}
}