fork download
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0402
  6. {
  7. public class SincronismoAsincronismo
  8. {
  9. public static void Main()
  10. {
  11. // Ejecución sincrónica del método OperacionTask:
  12. OperacionTask("Task desde el Thread de Main");
  13.  
  14. // Creación de Task asincrónico:
  15. Task<int> taskAsincronico = CrearTask("Task 1");
  16. taskAsincronico.Start();
  17. int resultado = taskAsincronico.Result;
  18. Console.WriteLine ("El resultado devuelto por Task 1 es: {0}", resultado);
  19.  
  20. // Creación nuevo Task para ejecución sincrónica:
  21. Task<int> taskSincronico = CrearTask("Task 2");
  22. taskSincronico.RunSynchronously();
  23. resultado = taskSincronico.Result;
  24. Console.WriteLine ("El resultado devuelto por Task 2 es: {0}", resultado);
  25.  
  26. // Creación de nueva tarea asincrónica:
  27. taskAsincronico = CrearTask("Task 3");
  28. taskAsincronico.Start();
  29.  
  30. // Mientras que la tarea no se haya completada,
  31. // mostrar su estado:
  32. while (!taskAsincronico.IsCompleted)
  33. {
  34. Console.WriteLine (taskAsincronico.Status);
  35. Thread.Sleep (TimeSpan.FromSeconds(0.5));
  36. }
  37.  
  38. // Muestra los estados finales de la ejecución
  39. // de la última tarea asincrónica:
  40. Console.WriteLine ("Estado de Task 3: {0}", taskAsincronico.Status);
  41. resultado = taskAsincronico.Result;
  42. Console.WriteLine ("El resultado devuelto por Task 3 es: {0}", resultado);
  43.  
  44. Console.WriteLine ();
  45. }
  46.  
  47. public static Task<int> CrearTask(string nombreTask)
  48. {
  49. return new Task<int>( () => OperacionTask(nombreTask));
  50. }
  51.  
  52. static int OperacionTask(string nombreTask)
  53. {
  54. Console.WriteLine ("\nID {0} se está ejecutando en el ID de Thread {1}. ¿Está en el pool de threads?: {2}",
  55. nombreTask,
  56. Thread.CurrentThread.ManagedThreadId,
  57. Thread.CurrentThread.IsThreadPoolThread);
  58.  
  59. Thread.Sleep (TimeSpan.FromSeconds(2));
  60.  
  61. return 42;
  62. }
  63. }
  64. }
Success #stdin #stdout 0.08s 29424KB
stdin
Standard input is empty
stdout
ID Task desde el Thread de Main se está ejecutando en el ID de Thread 1. ¿Está en el pool de threads?: False

ID Task 1 se está ejecutando en el ID de Thread 4. ¿Está en el pool de threads?: True
El resultado devuelto por Task 1 es: 42

ID Task 2 se está ejecutando en el ID de Thread 1. ¿Está en el pool de threads?: False
El resultado devuelto por Task 2 es: 42
WaitingToRun

ID Task 3 se está ejecutando en el ID de Thread 4. ¿Está en el pool de threads?: True
Running
Running
Running
Estado de Task 3: RanToCompletion
El resultado devuelto por Task 3 es: 42