Advertisement
Fhernd

CombinacionTareas.cs

Apr 22nd, 2016
11,393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.72 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0403
  6. {
  7.     public class CombinacionTareas
  8.     {
  9.         public static void Main()
  10.         {
  11.             // Creación de dos tareas para ejecutar el método Proceso:
  12.             var tareaNo1 = new Task<int>( () => Proceso("Tarea No. 1", 3));
  13.             var tareaNo2 = new Task<int>( () => Proceso("Tarea No. 2", 2));
  14.            
  15.             // Una vez terminada la ejecución de `tareaNo1`, se continua con la ejecución
  16.             // de la expresión lambda de ContinueWith:
  17.             tareaNo1.ContinueWith(
  18.                 t => Console.WriteLine ("Respuesta Tarea no. 1: {0}. ID Thread: {1}. ¿Thread de pool de threads?: {2}.",
  19.                     t.Result,
  20.                     Thread.CurrentThread.ManagedThreadId,
  21.                     Thread.CurrentThread.IsThreadPoolThread),
  22.                 TaskContinuationOptions.OnlyOnRanToCompletion
  23.             );
  24.            
  25.             // Inicia la ejecución asincrónica de los objetos Task:
  26.             tareaNo1.Start();
  27.             tareaNo2.Start();
  28.            
  29.             // Detiene la ejecución del thread de `Main`
  30.             // para dar tiempo de ejecución a los objetos Task:
  31.             Thread.Sleep(TimeSpan.FromSeconds(4));
  32.            
  33.             // Creación de tarea de continuación para responder a
  34.             // la finalización de de la Tarea no. 2:
  35.             Task continuacion = tareaNo2.ContinueWith(
  36.                 t => Console.WriteLine ("Respuesta Tarea no. 2: {0}. ID Thread: {1}. ¿Thread de pool de threads?: {2}.",
  37.                     t.Result,
  38.                     Thread.CurrentThread.ManagedThreadId,
  39.                     Thread.CurrentThread.IsThreadPoolThread),
  40.                 TaskContinuationOptions.OnlyOnRanToCompletion |
  41.                     TaskContinuationOptions.ExecuteSynchronously
  42.             );
  43.            
  44.             // Se ejecuta una vez que el objeto Task `tareaNo2` finalice:
  45.             continuacion.GetAwaiter().OnCompleted(
  46.                 () => Console.WriteLine ("Tarea de continuación de tarea 2 se completó. ID thread: {0}. ¿Thread de pool de threads?: {1}",
  47.                     Thread.CurrentThread.ManagedThreadId,
  48.                     Thread.CurrentThread.IsThreadPoolThread)
  49.             );
  50.            
  51.             // Detiene la ejecución del thread de Main
  52.             // para dar tiempo de ejecución a los objetos Task:
  53.             Thread.Sleep(TimeSpan.FromSeconds(2));
  54.             Console.WriteLine ();
  55.            
  56.             // Crea otra tarea con dos tareas -una anidad y otra de continuación-:
  57.             var tareaNo3 = new Task<int>( () => {
  58.                
  59.                 // Crea objeto Task anidado:
  60.                 var tareaAnidada = Task.Factory.StartNew(() =>
  61.                     Proceso("Tarea no. 4", 5),
  62.                     TaskCreationOptions.AttachedToParent
  63.                 );
  64.                
  65.                 // Una vez se complete la tarea anidada continuar con:
  66.                 tareaAnidada.ContinueWith( t =>
  67.                     Proceso("Tarea no. 5", 2),
  68.                     TaskContinuationOptions.AttachedToParent);
  69.                
  70.                 return Proceso("Tarea no. 3", 2);
  71.             });
  72.            
  73.             // Ejecución Tarea no. 3:
  74.             tareaNo3.Start();
  75.            
  76.             // Mientras que la tarea no. 3 se esté ejecutando:
  77.             while(!tareaNo3.IsCompleted)
  78.             {
  79.                 // Muestra en la salida estándar el estado actual
  80.                 // de ejecución del objeto Task `taskNo3`:
  81.                 Console.WriteLine ("Estado ejecución Tarea no. 3: {0}", tareaNo3.Status);
  82.                
  83.                 // Espera por ciclo:
  84.                 Thread.Sleep(TimeSpan.FromSeconds(0.5));
  85.             }
  86.            
  87.             Console.WriteLine ("\nÚltimo estado de Tarea no. 3: {0}.", tareaNo3.Status);
  88.            
  89.             // Espera en thread Main hasta de 10 segundos:
  90.             Thread.Sleep(TimeSpan.FromSeconds(10));
  91.            
  92.             Console.WriteLine ();
  93.         }
  94.        
  95.         // Proceso asincrónico para objetos Task:
  96.         public static int Proceso(string nombre, int segundos)
  97.         {
  98.             Console.WriteLine ("La {0} se está ejecutando en el ID de thread {1}. ¿Thread del pool de threads?: {2}.",
  99.                 nombre,
  100.                 Thread.CurrentThread.ManagedThreadId,
  101.                 Thread.CurrentThread.IsThreadPoolThread);
  102.            
  103.             // Espera simulada para este método de ejecución asincrónica:
  104.             Thread.Sleep(TimeSpan.FromSeconds(segundos));
  105.            
  106.             return 45 * segundos;
  107.         }
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement