Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Created June 14, 2014 22:00
Show Gist options
  • Save Fhernd/13c5eb9272e18aa4c69c to your computer and use it in GitHub Desktop.
Save Fhernd/13c5eb9272e18aa4c69c to your computer and use it in GitHub Desktop.
Demostración de la técnica de supervisión de finalización de llamada asincrónica de un método en C#.
using System;
using System.Threading;
namespace Recetas.Cap04
{
public sealed class Waiting
{
string ProcesoLargo (int tiempoRetraso, out int threadEjecucion)
{
Thread.Sleep (tiempoRetraso);
threadEjecucion = AppDomain.GetCurrentThreadId();;
return String.Format ("Tiempo de retraso: {0}", tiempoRetraso.ToString());
}
delegate string Delegado (int tiempoRetraso, out int threadEjecucion);
public void InvocacionAsincronica()
{
// Creación de la instancia del delegado, y la
// encapsulación del método `ProcesoLargo`:
Delegado del = new Delegado (this.ProcesoLargo);
// Captura la cadena de caracteres devuelta por llamada
// asincrónica al método `ProcesoLargo`:
string cadena;
// ID del thread que actúo sobre la llamada asincrónica:
int threadEjecucion;
// Iniciación de la invocación asincrónica del método `ProcesoLargo`:
IAsyncResult iar = del.BeginInvoke (3000, out threadEjecucion, null, null);
// Aquí se puede escribir código que se ejecutará en paralelo
// con la llamada asincrónica al método `ProcesoLargo`:
Console.WriteLine ("\nEsta sentencia se ejecutó mientras el método `ProcesoLargo` está en ejecución.");
// Espera a que se genera la señal WaitHandle:
iar.AsyncWaitHandle.WaitOne();
// `WaitOne` bloquea la ejecución del thread principal hasta que la ejecución
// asincrónica se complete. La siguiente l´nea no se ejecuta sino hasta que
// se genera la señal `WaitHandle`:
Console.WriteLine ("\nEsta sentencia espera a que la señal `WaitHandle` se complete en `WaitOne`.\n");
// Obtiene los resultados de la llamada asincrínica:
cadena = del.EndInvoke (out threadEjecucion, iar);
Console.WriteLine(String.Format ("Valor de retorno del delegado \"{0}\" sobre el thread {1}\n", cadena, threadEjecucion.ToString()));
}
public static void Main()
{
Waiting esm = new Waiting();
esm.InvocacionAsincronica();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment