Advertisement
Fhernd

Waiting.cs

Sep 16th, 2014
642
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.41 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Cap04
  5. {
  6.     public sealed class Waiting
  7.     {
  8.         string ProcesoLargo (int tiempoRetraso, out int threadEjecucion)
  9.         {
  10.             Thread.Sleep (tiempoRetraso);
  11.             threadEjecucion = AppDomain.GetCurrentThreadId();;
  12.             return String.Format ("Tiempo de retraso: {0}", tiempoRetraso.ToString());
  13.         }
  14.        
  15.         delegate string Delegado (int tiempoRetraso, out int threadEjecucion);
  16.        
  17.         public void InvocacionAsincronica()
  18.         {
  19.             // Creación de la instancia del delegado, y la
  20.             // encapsulación del método `ProcesoLargo`:
  21.             Delegado del = new Delegado (this.ProcesoLargo);
  22.            
  23.             // Captura la cadena de caracteres devuelta por llamada
  24.             // asincrónica al método `ProcesoLargo`:
  25.             string cadena;
  26.            
  27.             // ID del thread que actúo sobre la llamada asincrónica:
  28.             int threadEjecucion;
  29.            
  30.             // Iniciación de la invocación asincrónica del método `ProcesoLargo`:
  31.             IAsyncResult iar = del.BeginInvoke (3000, out threadEjecucion,  null, null);
  32.            
  33.             // Aquí se puede escribir código que se ejecutará en paralelo
  34.             // con la llamada asincrónica al método `ProcesoLargo`:
  35.             Console.WriteLine ("\nEsta sentencia se ejecutó mientras el método `ProcesoLargo` está en ejecución.");
  36.            
  37.             // Espera a que se genera la señal WaitHandle:
  38.             iar.AsyncWaitHandle.WaitOne();
  39.            
  40.             // `WaitOne` bloquea la ejecución del thread principal hasta que la ejecución
  41.             // asincrónica se complete. La siguiente l´nea no se ejecuta sino hasta que
  42.             // se genera la señal `WaitHandle`:
  43.             Console.WriteLine ("\nEsta sentencia espera a que la señal `WaitHandle` se complete en `WaitOne`.\n");
  44.            
  45.             // Obtiene los resultados de la llamada asincrínica:
  46.             cadena = del.EndInvoke (out threadEjecucion, iar);
  47.            
  48.             Console.WriteLine(String.Format  ("Valor de retorno del delegado \"{0}\" sobre el thread {1}\n", cadena, threadEjecucion.ToString()));
  49.         }
  50.        
  51.         public static void Main()
  52.         {
  53.             Waiting esm = new Waiting();
  54.             esm.InvocacionAsincronica();
  55.         }
  56.     }
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement