Programación Asíncrona antes de C#5 – Parte 1

Con la aparición de C#5 y WinRT se “disparo” la popularidad de la programación asíncrona, y es que C#5 introdujo a Lenguaje dos palabras nuevas que con el desarrollo de aplicaciones Metro es casi imposible no usarlas, se trata de Async y Await, y es tan popular que mucha gente cree que este par de palabras son las responsables de la ejecución asíncrona y la intención de tener experiencias de usuario “ininterrumpidas” en las aplicaciones metro style.

Pues ni la programación asíncrona es nueva ni mucho menos es responsabilidad de estas dos nuevas palabras claves del lenguaje, desde tiempos inmemorables hemos tenido la posibilidad de implementar modelos de desarrollo asíncronos como APM o EAP, y con la llegada de la TPL se nos quito mucha de la carga de encima.

En este articulo quiero mostrar como la programación asíncrona nos acompañado desde siempre y como C#5 no la hace mejor, o bueno la hace mejor para nosotros 😉

  • Asynchronous Programming Model (APM)

Este es el modelo más sencillo, y se basa simplemente en dividir una tarea en un inicio y un final, esto con un par de métodos BeginEnd.

En .net tenemos la posibilidad de que cualquier método se ejecute de forma asíncrona solo con definir un delegado con su misma firma, de hecho será este delegado quien nos dé la opción de la ejecución asíncrona, esto porque el compilador nos brinda generosamente la clase de nuestro delegado con los métodos BeginInvoke y EndInvoke [Mira aquí la documentación de MSDN]

Teniendo presente esto, vamos a ver un ejemplo de una aplicación que calcula la sumatoria de un número, de la misma forma que una multiplicación, i = n * c, solo que lo hago así para tener un ejemplo de un método que tarde bastante haciendo algo. Convertir la llamada de un método síncrono en asíncrono con esta técnica se simplifica mucho, el código queda de la siguiente manera:

        private delegate long SumatoriaDel(int numero, long nVeces);
        private void BtnCalcSumaClick(object sender, EventArgs e)
        {
            long nVeces = long.Parse(txtNVeces.Text);
            int numero = int.Parse(txtNumero.Text);
            SumatoriaDel delegado = Sumatoria;
            delegado.BeginInvoke(numero, nVeces, SumatoriaCallBack, delegado);
            //OtroCodigo 😀 
        }

        private static void SumatoriaCallBack(IAsyncResult result)
        {
            var delegado = result.AsyncState as SumatoriaDel;
            if (delegado != null)
            {
                long sumatoria = delegado.EndInvoke(result);
            }
        }

        public long Sumatoria(int numero, long nVeces)
        {
            long resultado = 0;
            for (int i = 0; i <= nVeces; i++)
            {
                resultado += numero;
            }
            return resultado;
        }

Algo que te preguntaras a esta altura, es porque no he empezado a hablar de los famosos hilos antes que de esta implementación, pues bien, la respuesta es sencilla, la programación asíncrona NO TIENE PORQUE SER MULTIHILO, (AUN QUE MUCHAS VECES LO HAGA) dado que esta se basa en delegar un trabajo pesado y esperar su respuesta. La anterior implementación SI GENERA UN HILO adicional, pero no es porque este sea su funcionamiento natural, es simplemente porque estamos esperando el callback cuando el trabajo se ha finalizado, y no tendríamos forma de saber (o bueno si, si hay formas) cuando nuestro trabajo pesado ha terminado y podemos recoger la respuesta sobre el mismo hilo. Por cuestiones como esta es que se suele confundir lo asíncrono con el Multitrheading.

Hasta aquí esta primera parte de la serie.

Hasta el próximo post.

Anuncios
Programación Asíncrona antes de C#5 – Parte 1

5 comentarios en “Programación Asíncrona antes de C#5 – Parte 1

  1. d41k dijo:

    Espero el siguiente post como ayua de mayo. xD
    Me ha gustado mucho la explicación y el enfoque que le has dado.

    Simple, claro y directo. Un 10.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s