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

Continuando con nuestro camino a través de la historia, llegamos a C#4 y una de sus más ‘sabrosas‘ novedades, la Task Parallel Library o TPL. Este conjunto de API’s pone a nuestra disposición una serie de herramientas que nos terminan de abstraer de todo el esfuerzo que conllevaría crear una aplicación multi-hilo y con paralelismo real (si el hardware lo permite). Dejando a .net toda la responsabilidad de la gestión y ejecución de las tareas administrando en principio todos los hilos y todo lo que conlleve el procesamiento en paralelo. En este post vamos a continuar con nuestro ejemplo esta vez empleando la TPL.

  • Task Parallel Library

Uno de los inconvenientes que hemos tenido en el trascurso de esto ejemplos es el manejo del Call Back en métodos ajenos al método que realiza la llamada y teniendo que agregar un esfuerzo mayor para poder recolectar la información resultado de nuestra ejecución asíncrona. En este ejemplo vamos a usar la clase reina de la TPL, la clase
Task.

Definimos un método nuevo llamado SumatoriaAsync que NO RETORNARA un long si no una Task<T> y recuperaremos el valor del callback en el mismo método que realiza la llamada.

        private void BtnCalcularSumatoriaTaskClick(object sender, EventArgs e)
        {
            var tarea = SumatoriaAsync(int.Parse(txtNumero.Text), long.Parse(txtNVeces.Text));
            tarea.ContinueWith(x =>
                                   {
                                       MessageBox.Show(x.Result.ToString());
                                   });
        }

        public Task<long> SumatoriaAsync(int numero, long nVeces)
        {
            return Task.Factory.StartNew(() => Sumatoria(numero, nVeces));
        }

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

Como vemos el trabajo de recuperar la información se hace mucho más fácil empleando la TPL además de todos los n beneficios que esta nos ofrece, como dice en la msdn: “Al utilizar la TPL, el usuario puede optimizar el rendimiento del código mientras se centra en el trabajo para el que el programa está diseñado.”

Hasta aquí este pequeñito post de la serie, creo que ya no restan sino dos.

Espero les sea de utilidad.

Hasta el próximo post.

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

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

  1. d41k dijo:

    Si que se ve sencillo el uso de la TPL …
    Pero para mi el uso ThreadPool.QueueUserWorkItem es la forma mas sencilla de hacer una llamada asincrona , no crees??
    un saludo!

  2. Estas TPL’s me estan volviendo loco … te queria hacer una consulta Nico, por si te ha pasado esto alguna vez.
    Estoy haciendo un servicio WCF, y bueno en un momento dado se realizan varias (imposible saber cuantas de antemano) llamadas que generan diferentes hilos de ejecución. El asunto es que yo necesito que terminen todos antes de que se continue ejecutando el codigo. Hasta ahora lo estaba haciendo con ManualResetEvent.WaitAll(ArrayDeWaitHandles), el problema que tengo es que este array desde que supera los 64 falla, al parecer es una limitación del tinglado. ¿Sabes si existe alguna forma de sortear este problema? Se que con TPL no tendria ese problema … pero es que me veo modificando mucho codigo por algo que creo un detalle …

    Hasta entonces estaba usando el IAsyncResult con Begin/End ..

    1. Hola 🙂

      Pues la verdad que yo poco al WCF 😛

      … Pero no entiendo algo (soy de mente lenta :P), quieres esperar a que todas las peticiones terminen, para ejecutar un codigo en especial?

      – Con TPL puedes usar varios mecanismos para esperar a la terminacion de tareas con wait, waitAny y WaitAll [http://msdn.microsoft.com/es-es/library/dd537610%28v=vs.100%29]

      – La verdad que no conozco esa limitacion que comentas (la de los 64), se que hay una excepción que salta cuando pasas objetos duplicados al array, pero no una como la que comentas.

      Quedo atento a tu respuesta.

      Saludos.

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