fork download
  1. using System;
  2. using System.ComponentModel;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5.  
  6. namespace Recetas.Multithreading.R0405
  7. {
  8. public class ConversionEAPaTPL
  9. {
  10. public static void Main()
  11. {
  12. Console.WriteLine ();
  13.  
  14. var tcs = new TaskCompletionSource<int>();
  15.  
  16. var worker = new BackgroundWorker();
  17.  
  18. // Ocurre una vez que se invoca el método `RunWorkerAsync`:
  19. worker.DoWork += (sender, eventArgs) =>
  20. {
  21. // Invocación asincrónica de `Tarea`:
  22. eventArgs.Result = Tarea("Ejecución con worker", 5);
  23. };
  24.  
  25. worker.RunWorkerCompleted += (sender, eventArgs) =>
  26. {
  27. // Se comprueba la finalización del thread creado por
  28. // BackgroundWorker:
  29. if (eventArgs.Error != null)
  30. {
  31. tcs.SetException(eventArgs.Error);
  32. }
  33. else if (eventArgs.Cancelled)
  34. {
  35. tcs.SetCanceled();
  36. }
  37. else
  38. {
  39. tcs.SetResult((int)eventArgs.Result);
  40. }
  41. };
  42.  
  43. // Inicia la ejecución asincrónica del método `Tarea`:
  44. worker.RunWorkerAsync();
  45.  
  46. // Recupera el resultado obtenido por la ejecución asincrónica de `Tarea`:
  47. int resultado = tcs.Task.Result;
  48.  
  49. Console.WriteLine ("Resultado de la operación asincrónica: {0}.\n", resultado);
  50. }
  51.  
  52. // Proceso de ejecución asincrónica:
  53. public static int Tarea(string nombre, int duracion)
  54. {
  55. Console.WriteLine ("La tarea `{0}` se está ejecutando en el ID {1}. " +
  56. "¿Thread en pool de threads?: {2}.", nombre,
  57. Thread.CurrentThread.ManagedThreadId,
  58. Thread.CurrentThread.IsThreadPoolThread);
  59.  
  60. // Simulación de ejecución tardía:
  61. Thread.Sleep (TimeSpan.FromSeconds(duracion));
  62.  
  63. return 42 * duracion;
  64. }
  65. }
  66. }
Success #stdin #stdout 0.06s 29312KB
stdin
Standard input is empty
stdout
La tarea `Ejecución con worker` se está ejecutando en el ID 4. ¿Thread en pool de threads?: True.
Resultado de la operación asincrónica: 210.