sábado, 22 de junio de 2013

¿Qué hay de nuevo en C# 5.0?

En esta entrada presento una de las características más interesantes en la versión más reciente (5.0) del lenguaje de programación gestionado C#. Esta característica consiste en programación multi-hilo, les estoy hablando de las funciones asíncronas. Esto resulta ideal para la escritura de aplicaciones cliente enriquecidas de alto rendimiento, además, de hacer más eficiente los procesos que involucran la escritura y lectura de datos de diferentes flujos (e.g., red, local).

- ¿Qué es una función asíncrona?:

Una función asíncrona es (valga el pleonasmo) una función, en un ambiente multi-hilo, que se puede ejecutar de forma concurrente. Estas funciones resultan idóneas para procesos que toman largo tiempo en completarse (v.gr., lectura de disco duro de un archivo de gran tamaño, o desde un canal ralentizado por efectos del entorno: usuarios conectados, consumo del ancho de banda, etc.).

También se puede definir una función asíncrona como un subproceso que puede ser ejecutado en segundo plano dentro de otro hilo mientras que el proceso principal realiza otras operaciones para completarse.

- Ejemplo async [2] y await [3]:

En este primer ejemplo FuncionSumaLenta se muestra el uso básico de estas dos palabras claves del lenguaje C#: async y await.

Función FuncionSumaLenta:


private int FuncionSumaLenta(int a, int b)
{
System.Threading.Thread.Sleep(5000);
return a + b;
}

Como se puede apreciar, es una función muy simple que recibe dos números enteros como parámetros, y se realiza una espera de 5 segundos (System.Threading.Thread.Sleep(5000);) para que finalmente se arroje el resultado de la suma (return a + b;).

Ahora, se crea un formulario simple como este:
Ejemplo Simple async y await
Figura 1. Ejemplo Simple async y await
A continuación se programa el evento Click del botón 'Calcular', así:

private async void btnCalcular_Click(object sender, EventArgs e)
{
this.btnCalcular.Enabled = false;
var tarea = Task<int>.Factory.StartNew(() => FuncionSumaLenta(Int32.Parse(txtNumeroA.Text),Int32.Parse(txtNumeroB.Text)));

await tarea;

this.lblResulado.Text = "Resultado: " + tarea.Result.ToString();

this.btnCalcular.Enabled = true;
}

async en la firma del evento private async void btnCalcular_Click(object sender, EventArgs e) 
especifica que el código dentro del cuerpo del método ejecutará un proceso de manera asíncrona a través de await.

En el momento de realizar una primera prueba al ejemplo anterior, vemos que hasta que la tarea tarea no haya terminado de ejecutarse, el botón 'Calcular' no se reactivará. Sin embargo, la interfaz completa sigue respondiendo a eventos generados por el usuario: alternar entre campos, minimizar, maximizar, etc.

Conclusiones:

En este post se ha mostrado una de las novedades más interesantes en la versión 5.0 de C#. Es de vital importancia saber manejar y optimizar el uso de los recursos hardware (tiempo de procesador y espacio en memoria) que consumen las aplicaciones que escribimos; precisamente, en escenarios que pudieran presentarse tareas de procesamiento largo: lectura de disco, respuesta de interfaz de usuario, conexiones a una red remota, etc.

Glosario:

- async
- await
- Background
- Cliente enriquecido
- Función asíncrona
- Función síncrona
- Hilo
- Segundo plano

Referencias:

[1] C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.

2 comentarios:

  1. Buenas tardes.

    Antes de nada agradecerle su trabajo aquí.

    Quería comentarle que no se ven ninguna imagen con el código que se supone que debe mostrarse.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. Hola David. El artículo fue actualizado con las correcciones de presentación de código fuente. Gracias por su comentario y observación. Saludos desde Bogotá D.C.

      Eliminar

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.