using System; using System.ComponentModel; using System.Threading; namespace Recetas.Multithreading.R0307 { public class AsincronismoBackgroundWorker { public static void Main() { var bw = new BackgroundWorker(); bw.WorkerReportsProgress = true; bw.WorkerSupportsCancellation = true; // Evento de respuesta al inicio de la ejecución de la operación asincrónica: bw.DoWork += Worker_DoWork; // Evento de respuesta al progreso de la ejecución de la operación asincrónica: bw.ProgressChanged += Worker_ProgressChanged; // Evento de respuesta a la finalización de la ejecución de la operación asincrónica: bw.RunWorkerCompleted += Worker_Completed; // Inicio de la ejecución de la operación asincrónica: bw.RunWorkerAsync(); // Método de cancelación de la ejecución de la operación asincrónica: Console.WriteLine ("\nPresione la tecla C para cancelar la ejecución...\n"); do { if (Console.ReadKey(true).KeyChar == 'C') { bw.CancelAsync(); } } while (bw.IsBusy); Console.WriteLine (); } // Evento de respuesta al inicio de ejecución de la ejecución // de la operación asincrónica: public static void Worker_DoWork(object sender, DoWorkEventArgs e) { // Muestra estado de la ejecución de la operación asincrónica: Console.WriteLine ("ID del thread para esta operación asincrónica: {0}\n", Thread.CurrentThread.ManagedThreadId); // Obtiene el objeto BackgroundWorker: var bw = (BackgroundWorker) sender; for (int porcentaje = 1; porcentaje <= 100; ++porcentaje) { // Comprueba la finalización de la operación asincrónica: if (bw.CancellationPending) { e.Cancel = true; return; } // Reporta porcentaje de ejecución cada 10%: if (porcentaje % 10 == 0) { bw.ReportProgress(porcentaje); } // Simulación temporal de ejecución operación asincrónica: Thread.Sleep(TimeSpan.FromSeconds(0.1)); } e.Result = 42; } // Reporta el progreso de la operación asincrónica: public static void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Console.WriteLine ("{0}% completado. Thread ID: {1}", e.ProgressPercentage, Thread.CurrentThread.ManagedThreadId); } // Evento de respuesta a la finalización de la operación asincrónica: public static void Worker_Completed(object sender, RunWorkerCompletedEventArgs e) { Console.WriteLine ("\nOperación asincrónica finalizada en el Thread ID: {0}", Thread.CurrentThread.ManagedThreadId); if (e.Error != null) { Console.WriteLine ("Ha ocurrido la excepción: {0}", e.Error.Message); } else if (e.Cancelled) { Console.WriteLine ("La operación asincrónica ha sido cancelada."); } else { Console.WriteLine ("La respuesta de la operación asincrónica es: {0}", e.Result); } } } }