Advertisement
Fhernd

AsincronismoBackgroundWorker.cs

Mar 24th, 2016
916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.74 KB | None | 0 0
  1. using System;
  2. using System.ComponentModel;
  3. using System.Threading;
  4.  
  5. namespace Recetas.Multithreading.R0307
  6. {
  7.     public class AsincronismoBackgroundWorker
  8.     {
  9.         public static void Main()
  10.         {
  11.             var bw = new BackgroundWorker();
  12.             bw.WorkerReportsProgress = true;
  13.             bw.WorkerSupportsCancellation = true;
  14.            
  15.             // Evento de respuesta al inicio de la ejecución de la operación asincrónica:
  16.             bw.DoWork += Worker_DoWork;
  17.             // Evento de respuesta al progreso de la ejecución de la operación asincrónica:
  18.             bw.ProgressChanged += Worker_ProgressChanged;
  19.             // Evento de respuesta a la finalización de la ejecución de la operación asincrónica:
  20.             bw.RunWorkerCompleted += Worker_Completed;
  21.            
  22.             // Inicio de la ejecución de la operación asincrónica:
  23.             bw.RunWorkerAsync();
  24.            
  25.             // Método de cancelación de la ejecución de la operación asincrónica:
  26.             Console.WriteLine ("\nPresione la tecla C para cancelar la ejecución...\n");
  27.             do
  28.             {
  29.                 if (Console.ReadKey(true).KeyChar == 'C')
  30.                 {
  31.                     bw.CancelAsync();
  32.                 }
  33.             } while (bw.IsBusy);
  34.            
  35.             Console.WriteLine ();
  36.         }
  37.        
  38.         // Evento de respuesta al inicio de ejecución de la ejecución
  39.         // de la operación asincrónica:
  40.         public static void Worker_DoWork(object sender, DoWorkEventArgs e)
  41.         {
  42.             // Muestra estado de la ejecución de la operación asincrónica:
  43.             Console.WriteLine ("ID del thread para esta operación asincrónica: {0}\n", Thread.CurrentThread.ManagedThreadId);
  44.            
  45.             // Obtiene el objeto BackgroundWorker:
  46.             var bw = (BackgroundWorker) sender;
  47.            
  48.             for (int porcentaje = 1; porcentaje <= 100; ++porcentaje)
  49.             {
  50.                 // Comprueba la finalización de la operación asincrónica:
  51.                 if (bw.CancellationPending)
  52.                 {
  53.                     e.Cancel = true;
  54.                     return;
  55.                 }
  56.                
  57.                 // Reporta porcentaje de ejecución cada 10%:
  58.                 if (porcentaje % 10 == 0)
  59.                 {
  60.                     bw.ReportProgress(porcentaje);
  61.                 }
  62.                
  63.                 // Simulación temporal de ejecución operación asincrónica:
  64.                 Thread.Sleep(TimeSpan.FromSeconds(0.1));
  65.             }
  66.            
  67.             e.Result = 42;
  68.         }
  69.        
  70.         // Reporta el progreso de la operación asincrónica:
  71.         public static void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  72.         {
  73.             Console.WriteLine ("{0}% completado. Thread ID: {1}", e.ProgressPercentage, Thread.CurrentThread.ManagedThreadId);
  74.         }
  75.        
  76.         // Evento de respuesta a la finalización de la operación asincrónica:
  77.         public static void Worker_Completed(object sender, RunWorkerCompletedEventArgs e)
  78.         {
  79.             Console.WriteLine ("\nOperación asincrónica finalizada en el Thread ID: {0}", Thread.CurrentThread.ManagedThreadId);
  80.            
  81.             if (e.Error != null)
  82.             {
  83.                 Console.WriteLine ("Ha ocurrido la excepción: {0}", e.Error.Message);
  84.             }
  85.             else if (e.Cancelled)
  86.             {
  87.                 Console.WriteLine ("La operación asincrónica ha sido cancelada.");
  88.             }
  89.             else
  90.             {
  91.                 Console.WriteLine ("La respuesta de la operación asincrónica es: {0}", e.Result);
  92.             }
  93.         }
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement