fork download
  1. // OrtizOL - xCSw - http://o...content-available-to-author-only...t.com
  2.  
  3. using System;
  4. using System.Threading;
  5.  
  6. namespace Receta.Multithreading.R0301
  7. {
  8. public class InvocacionDelegadoEnPoolThreads
  9. {
  10. // Declaración de delegado:
  11. private delegate string EjecutarEnPoolThread(out int idThread);
  12.  
  13. public static void Main()
  14. {
  15. Console.WriteLine(Environment.NewLine);
  16.  
  17. int idThread = 0;
  18.  
  19. // Creación de thread (forma tradicional):
  20. Thread t = new Thread(() => Proceso(out idThread));
  21. t.Start();
  22. t.Join();
  23.  
  24. Console.WriteLine("ID Thread: {0}\n", idThread);
  25.  
  26. // Invocación de delegado (método basado en pool de threads):
  27. EjecutarEnPoolThread delegadoEnPool = Proceso;
  28.  
  29. IAsyncResult r = delegadoEnPool.BeginInvoke(out idThread,
  30. Callback, "Invocación asincrónica de delegado");
  31. r.AsyncWaitHandle.WaitOne();
  32.  
  33. // Obtiene el resultado de la ejecución de `Proceso`:
  34. string resultado = delegadoEnPool.EndInvoke(out idThread, r);
  35.  
  36. Console.WriteLine("ID de thread del pool de threads: {0}",
  37. idThread.ToString());
  38.  
  39. Console.WriteLine(resultado);
  40.  
  41. Thread.Sleep(TimeSpan.FromSeconds(2));
  42.  
  43. Console.WriteLine(Environment.NewLine);
  44. }
  45.  
  46. private static void Callback(IAsyncResult ar)
  47. {
  48. Console.WriteLine("Inicio de callback...");
  49. Console.WriteLine("Estado de callback: {0}", ar.AsyncState);
  50. Console.WriteLine("¿Thread en pool de threads?: {0}",
  51. Thread.CurrentThread.IsThreadPoolThread);
  52. Console.WriteLine("ID de thread del pool de threads: {0}",
  53. Thread.CurrentThread.ManagedThreadId);
  54. }
  55.  
  56. private static String Proceso(out int idThread)
  57. {
  58. Console.WriteLine("Iniciando ejecución de `Proceso`...");
  59. Console.WriteLine("¿Thread en pool de threads?: {0}",
  60. Thread.CurrentThread.IsThreadPoolThread);
  61. Thread.Sleep(TimeSpan.FromSeconds(2));
  62.  
  63. idThread = Thread.CurrentThread.ManagedThreadId;
  64.  
  65. return String.Format("ID de thread asignado desde pool de threads: {0}",
  66. idThread);
  67. }
  68. }
  69. }
Success #stdin #stdout 0.05s 27320KB
stdin
Standard input is empty
stdout

Iniciando ejecución de `Proceso`...
¿Thread en pool de threads?: False
ID Thread: 3

Iniciando ejecución de `Proceso`...
¿Thread en pool de threads?: True
Inicio de callback...
Estado de callback: Invocación asincrónica de delegado
¿Thread en pool de threads?: True
ID de thread del pool de threads: 5
ID de thread del pool de threads: 5
ID de thread asignado desde pool de threads: 5