Programación Asíncrona con async y await

miércoles, 5 de septiembre de 2012

Vamos a ver un ejemplo de la nueva forma de programación asíncrona con el Framework 4.5 con las palabras clave async y await.

Async y await están diseñadas en c# 5 para trabajar con Task Parallel Library y mantener la estructura de código más sencilla. Con estas dos palabras clave podemos programar de forma asíncrona de la misma forma que si fuera síncrona,es decir, con un método simple.



El ejemplo es muy sencillo, vamos a rellenar un ListBox con los números impares de 0 a 99999.

Creamos un proyecto de WPF en Visual Studio 2012 y añadimos un ListBox.
 
    
        
    


Ahora en el fichero cs de la ventana creamos una colección para enlazar con el ListBox.
 ObservableCollection _collection = new ObservableCollection();

Añadimos en el constructor el manejador del evento Loaded de la ventana.
        public MainWindow()
        {
            InitializeComponent();

            this.Loaded +=MainWindow_Loaded;
            
        }

Creamos una función cuya idea es que dado un número por parámetro nos devuelve un booleano indicando si es impar o no,se utiliza el modelo asíncrono basado en tarea el valor devuelto debe ser tipo task, así que devolvemos un objeto Task. Utilizamos el nuevo método run, en framework 4.5 del objeto Task para devolver el resultado. Por convención de nombres el método debería terminar con la palabra Async.

    private Task IsOddNumberAsync(int value)
        {
            return Task.Run(() => value % 2 != 0);
        }      

Al método MainWindow_Loaded le añadimos la palabra clave async, que indica al compilador que es un método asíncrono. Dentro de un método asíncrono el compilador espera unos o más operadores await que lo que hace es que cuando termina el método asincrono ejecuta el código que tiene inmediatamente despues. Este operador await lo utilizamos para realizar la llamada a nuestra función. También asignamos el ItemsSource del Listbox al principio para que se empiecen a ver datos mientras termina de cargar todos.
   private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            DataList.ItemsSource = _collection;
                             

            for (var x = 1; x < 99999; x++)
            {

                if (await IsOddNumberAsync(x))
                {
                    _collection.Add(x);
                }
            }
        }   

Libros Relacionados



No hay comentarios:

Publicar un comentario