fork download
  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. }
Success #stdin #stdout 10.12s 29320KB
stdin
Standard input is empty
stdout
Presione la tecla C para cancelar la ejecución...

ID del thread para esta operación asincrónica: 4

10% completado. Thread ID: 5
20% completado. Thread ID: 5
30% completado. Thread ID: 5
40% completado. Thread ID: 5
50% completado. Thread ID: 5
60% completado. Thread ID: 5
70% completado. Thread ID: 5
80% completado. Thread ID: 5
90% completado. Thread ID: 5
100% completado. Thread ID: 5

Operación asincrónica finalizada en el Thread ID: 5
La respuesta de la operación asincrónica es: 42