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);
}
}
}
}