Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement