= $u_time + 86400) { $modifiedDate = get_the_modified_time('F jS, Y'); echo 'Última modificación: '.$modifiedDate.''; } }?>

Métodos asíncronos en Windows 8.1 y Windows Phone 8.1

Habitualmente las instrucciones de un programa se ejecutan de manera síncrona, es decir, una tras otra, sin embargo en determinadas circunstancias se puede necesitar que esto no sea así.
Por ejemplo, podemos tener una lista cuyo contenido deseamos que cargue al inicio de nuestra aplicación pero que ello no implique que tengamos que esperar a que termine de cargarse para poder interactuar. Es el momento perfecto para crear un método asíncrono que se ejecute en segundo plano mientras hacemos otras cosas; cuando necesitemos que estos datos se muestren “esperaremos” a que la tarea de carga termine (si es que no ha terminado ya) y mostramos los datos. Pero vamos por partes:

Vamos a crear un método asíncrono que rellene una lista con elementos del tipo “Vegetales”; éste método devolverá una tarea de tipo Task, en este caso una ObservableCollection:

private Task<ObservableCollection> GetVegetablesAsync()
{
    return new Task<ObservableCollection>(
        () =>
        {
            var list = new ObservableCollection ();
            for ( var i = 0; i < 10000; i++)
            {
                list.Add( new Vegetables ("Vegetable - " + i));
            }

            return list;
        });
}

Seguidamente crearemos en nuestro ViewModel un comando que ejecutará un método encargado de esperar a que esta tarea termine, asigne el resultado de la tarea a nuestra lista de vegetales y actualice la visibilidad de la lista en la Vista:

public ICommand ShowVegetablesCommand { get; private set; }

private async void OnShowVegetables()
{
    this.ProgressVisibility = true;
    if (! this.VegetablesTask.IsCompleted)
    {
        await this.VegetablesTask;
    }
    this.VegetablesList = this.VegetablesTask.Result;
    this.ProgressVisibility = false;
}

En el constructor inicializamos nuestro Command:

this.ShowVegetablesCommand = new RelayCommand (this.OnShowVegetables);

Crearemos un botón en nuestro XAML y lo bindaremos a nuestro comando:


 

<Page.Resources>
     <DataTemplate x : Key="VegetableTemplate">
            <TextBlock Text ="{Binding Name}" d:DataContext ="{d:DesignInstance models:Vegetables}"></TextBlock>
     </DataTemplate>
</Page.Resources >
<Button Content ="Show Vegetables List Async Task"
         Command="{Binding ShowVegetablesCommand}">
</Button>
<ListView ItemsSource ="{Binding VegetablesList,Mode=TwoWay}"
          ItemTemplate="{StaticResource VegetableTemplate}">
</ListView>

Os podéis descargar un ejemplo en el siguiente enlace: AsyncTasks.Sample.Universal.zip

Nota: En el ejemplo encontraréis otro método asíncrono llamado GetVegetablesWithDelayAsync que espera 5 segundo hasta terminar la tarea, lo que os permitirá haceros una mejor idea de como el operador “await” espera a la tarea.

Leave a Reply

Your email address will not be published. Required fields are marked *