fork download
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0404
  6. {
  7. public class ConversionAPMaTPL
  8. {
  9. public static void Main()
  10. {
  11. // Variables auxiliares...
  12. int idThread;
  13. TareaAsincronica ta = Prueba;
  14. TareaAsincronicaIncompatible tai = Prueba;
  15.  
  16. Console.WriteLine ("\nOpción 1:\n");
  17.  
  18. // Tarea para el delegado TareaAsincronica:
  19. Task<string> tarea = Task<string>.Factory.FromAsync(
  20. ta.BeginInvoke("ThreadTareaAsincronica", Callback, "Invocación asincrónica con delegado."),
  21. ta.EndInvoke
  22. );
  23.  
  24. // Continuar tarea:
  25. tarea.ContinueWith(t => Console.WriteLine ("El callback ha terminado.\n\tEjecución de continuación.\n\t\tResultado: {0}",
  26. t.Result));
  27.  
  28. // Mientras termina la tarea muestra su estado:
  29. while (!tarea.IsCompleted)
  30. {
  31. Console.WriteLine ("Estado de la tarea: {0}", tarea.Status);
  32. Thread.Sleep (TimeSpan.FromSeconds(0.5));
  33. }
  34.  
  35. // El último estado de la tarea:
  36. Console.WriteLine ("Último estado tarea: {0}", tarea.Status);
  37. Thread.Sleep(TimeSpan.FromSeconds(1));
  38.  
  39.  
  40. Console.WriteLine ("----------------------------------------");
  41. Console.WriteLine ();
  42. Console.WriteLine ("Opción 2:\n");
  43.  
  44. // Variante de la opción 1:
  45. tarea = Task<string>.Factory.FromAsync(
  46. ta.BeginInvoke, ta.EndInvoke, "ThreadTareaAsincronica", "Invocación asincrónica con delegado."
  47. );
  48.  
  49. // Continuación tarea:
  50. tarea.ContinueWith(t => Console.WriteLine ("Tarea completada.\n\tEjecución de continuación.\n\tResultado: {0}",
  51. t.Result));
  52.  
  53. // Mientras termina la tarea muestra su estado:
  54. while (!tarea.IsCompleted)
  55. {
  56. Console.WriteLine ("Estado de la tarea: {0}", tarea.Status);
  57. Thread.Sleep(TimeSpan.FromSeconds(0.5));
  58. }
  59.  
  60. // El último estado de la tarea:
  61. Console.WriteLine ("Último estado tarea: {0}", tarea.Status);
  62. Thread.Sleep(TimeSpan.FromSeconds(1));
  63.  
  64.  
  65. Console.WriteLine ("------------------------------------------");
  66. Console.WriteLine ();
  67. Console.WriteLine ("Opción 3:\n");
  68.  
  69. // Envoltura del callback:
  70. IAsyncResult ar = tai.BeginInvoke(out idThread, Callback, "Invocación asincrónica de delegado.");
  71.  
  72. tarea = Task<string>.Factory.FromAsync(ar, _ => tai.EndInvoke(out idThread, ar));
  73.  
  74. // Continuación tarea:
  75. tarea.ContinueWith( t =>
  76. Console.WriteLine("Tarea completada.\n\tEjecución de continuación.\n\tResultado: {0}\n\tID Thread: {1}",
  77. t.Result, idThread));
  78.  
  79. // Mientras termina la tarea muestra su estado:
  80. while (!tarea.IsCompleted)
  81. {
  82. Console.WriteLine ("Estado de la tarea: {0}", tarea.Status);
  83. Thread.Sleep(TimeSpan.FromSeconds(0.5));
  84. }
  85.  
  86. Console.WriteLine ();
  87. Console.WriteLine ("Último estado tarea: {0}", tarea.Status);
  88.  
  89. Thread.Sleep(TimeSpan.FromSeconds(1));
  90.  
  91. Console.WriteLine ();
  92. }
  93.  
  94. // Delegado con firma directamente compatible con TPL:
  95. private delegate string TareaAsincronica(string nombreThread);
  96.  
  97. // Delegado con firma no compatible con TPL:
  98. private delegate string TareaAsincronicaIncompatible(out int idThread);
  99.  
  100. // Callback para respuesta a llamadas asincrónicas:
  101. private static void Callback(IAsyncResult ar)
  102. {
  103. Console.WriteLine ("Iniciando callback...");
  104. Console.WriteLine ("Estado pasado al callback: {0}", ar.AsyncState);
  105. Console.WriteLine ("¿Thread del pool de threads?: {0}",
  106. Thread.CurrentThread.IsThreadPoolThread);
  107. Console.WriteLine ("ID del thread: {0}", Thread.CurrentThread.ManagedThreadId);
  108. }
  109.  
  110. // Método para ejecución asincrónica:
  111. private static string Prueba(string nombreThread)
  112. {
  113. Console.WriteLine ("Iniciando prueba...");
  114. Console.WriteLine ("¿Thread del pool de threads?: {0}",
  115. Thread.CurrentThread.IsThreadPoolThread);
  116.  
  117. // Espera simulada:
  118. Thread.Sleep(TimeSpan.FromSeconds(2));
  119.  
  120. Thread.CurrentThread.Name = nombreThread;
  121.  
  122. // Resultado:
  123. return String.Format("-Nombre thread: {0}-", Thread.CurrentThread.Name);
  124. }
  125.  
  126. // Método para ejecución asincrónica:
  127. private static string Prueba(out int idThread)
  128. {
  129. Console.WriteLine ("Iniciando prueba...");
  130. Console.WriteLine ("¿Thread del pool de threads?: {0}",
  131. Thread.CurrentThread.IsThreadPoolThread);
  132.  
  133. // Simulación de espera:
  134. Thread.Sleep(TimeSpan.FromSeconds(2));
  135.  
  136. idThread = Thread.CurrentThread.ManagedThreadId;
  137.  
  138. // Resultado:
  139. return String.Format("-ID del thread del pool de threads: {0}-", idThread);
  140. }
  141. }
  142. }
Success #stdin #stdout 0.1s 31544KB
stdin
Standard input is empty
stdout
Opción 1:

Iniciando prueba...
¿Thread del pool de threads?: True
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Iniciando callback...
Estado pasado al callback: Invocación asincrónica con delegado.
¿Thread del pool de threads?: True
ID del thread: 4
El callback ha terminado.
	Ejecución de continuación.
		Resultado: -Nombre thread: ThreadTareaAsincronica-
Último estado tarea: RanToCompletion
----------------------------------------

Opción 2:

Estado de la tarea: WaitingForActivation
Iniciando prueba...
¿Thread del pool de threads?: True
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Tarea completada.
	Ejecución de continuación.
	Resultado: -Nombre thread: ThreadTareaAsincronica-
Último estado tarea: RanToCompletion
------------------------------------------

Opción 3:

Estado de la tarea: WaitingForActivation
Iniciando prueba...
¿Thread del pool de threads?: True
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Estado de la tarea: WaitingForActivation
Iniciando callback...
Estado pasado al callback: Invocación asincrónica de delegado.
¿Thread del pool de threads?: True
ID del thread: 5
Tarea completada.
	Ejecución de continuación.
	Resultado: -ID del thread del pool de threads: 5-
	ID Thread: 5

Último estado tarea: RanToCompletion