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: } } } }