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.R0302
  7. {
  8. public class OperacionAsincronicaEnPoolThreads
  9. {
  10. public static void Main()
  11. {
  12. Console.WriteLine(Environment.NewLine);
  13.  
  14. // Variables auxiliares:
  15. const int x = 11;
  16. const int y = 3;
  17. const string estado = "Estado 3 (closure)";
  18.  
  19. // Pasa implícitamente un objeto WaitCallback:
  20. ThreadPool.QueueUserWorkItem(OperacionAsincronica);
  21.  
  22. // Esperada simulada en `Main`:
  23. Thread.Sleep(TimeSpan.FromSeconds(1));
  24.  
  25. // Uso de segunda versión sobrecargada de QueueUserWorkItem:
  26. ThreadPool.QueueUserWorkItem(OperacionAsincronica, "Estado 1 (estándar)");
  27.  
  28. // Esperada simulada en `Main`:
  29. Thread.Sleep(TimeSpan.FromSeconds(1));
  30.  
  31. // Uso de versión lambda para operación asincrónica:
  32. ThreadPool.QueueUserWorkItem( obj => {
  33. Console.WriteLine ("Estado operación: {0}", obj);
  34. Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId);
  35.  
  36. Thread.Sleep(TimeSpan.FromSeconds(2));
  37. }, "Estado 2 (lambda)" );
  38.  
  39. // Versión closure:
  40. ThreadPool.QueueUserWorkItem( _ => {
  41. Console.WriteLine ("Estado operación: {0}, {1}", x + y, estado);
  42. Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId);
  43.  
  44. Thread.Sleep(TimeSpan.FromSeconds(2));
  45. });
  46.  
  47. // Esperada simulada en `Main`:
  48. Thread.Sleep(TimeSpan.FromSeconds(2));
  49.  
  50. Console.WriteLine(Environment.NewLine);
  51. }
  52.  
  53. // Método de ejecución asincrónica:
  54. private static void OperacionAsincronica(Object estado)
  55. {
  56. Console.WriteLine ("Estado operación: {0}", estado ?? "(null)");
  57. Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId);
  58.  
  59. Thread.Sleep(TimeSpan.FromSeconds(2));
  60. }
  61. }
  62. }
Success #stdin #stdout 0.05s 31576KB
stdin
Standard input is empty
stdout

Estado operación: (null)
ID thread de pool: 4
Estado operación: Estado 1 (estándar)
ID thread de pool: 5
Estado operación: Estado 2 (lambda)
ID thread de pool: 4
Estado operación: 14, Estado 3 (closure)
ID thread de pool: 6