using System;
using System.Threading;
namespace Recetas.CSharp.R0413
{
public sealed class FinalizarEjecucionThread
{
// Punto de entrada de ejecución de la aplicación:
public static void Main()
{
Console.Title = "--- Terminación Ejecución de un Thread ---";
Console.WriteLine ();
// Creación de una instancia de `Thread`:
Thread t = new Thread (MostrarMensaje);
// Mensaje guía para el usuario:
Console.WriteLine ("Inicio ejecución thread - {0} - {1}\n",
DateTime.Now.ToString ("HH:mm:ss.ffff"),
"Presione la tecla `Enter` para finalizar la ejecución."
);
// Iniciar la ejecución del método `MostrarMensaje`:
t.Start();
// Hasta que el usuario no presione la tecla `Enter`,
// la ejecución del thread no finalizará:
Console.ReadLine();
// Invoca al método `Abort` con un mensaje alusivo
// al evento que finalizó la ejecución:
t.Abort ("El usuario presionó `Enter`");
// Bloqueo temporal del thread `Main` para
// realizar una espera de finalización del método
// `MostrarMensaje`:
t.Join();
// Mensaje de finalización:
Console.WriteLine ("\nPresione `Enter` para terminar la aplicación.");
Console.ReadLine();
}
// Este método muestra información acerca de la
// ejecución de un thread cada segundo:
private static void MostrarMensaje()
{
try
{
while (true)
{
// Registro con la hora de generación
// del mensaje:
Console.WriteLine ("Thread en ejecución - {0}",
DateTime.Now.ToString ("HH:mm:ss.ffff")
);
// Pausa durante un (1) segundo:
Thread.Sleep (1000);
}
}
catch (ThreadAbortException tae)
{
// Muestra información acerca la generación de
// la excepción ThreadAbortException, junto con
// el estado de la excepción, además de la hora:
Console.WriteLine ("\nTerminación de la ejecución del thread: {0} - {1}",
(string) tae.ExceptionState,
DateTime.Now.ToString ("HH:mm:ss.ffff")
);
// Aquí podríamos incluir una llmada al método static
// Thread.ResetAbort para cancelar la solicitud
// de terminarción del thread:
}
}
}
}