mercoledì 24 luglio 2013

Programmazione asincrona con Async ed Await in C# 4.5

Piccolo esempio sulla programmazione asincrona con le nuove parole chiave del .Net Framework 4.5: async ed await.

C#

public partial class MainWindow : Window
{
    private int Compute()
    {
        int somma = 0;
        for (int i = 0i < 10000i++)
        {
            somma += i;
            Console.WriteLine(i);
        }
 
        return somma;
    }
 
    private Task<int> ComputeAsync()
    {
        return Task.Run(() => Compute());
    }
 
    public MainWindow()
    {
        InitializeComponent();
    }
 
    private void btnCompute_Click(object senderRoutedEventArgs e)
    {
        Console.WriteLine("Elaborazione in corso...");
        int somma = Compute();
        Console.WriteLine("Elaborazione terminata: " + somma);
    }
 
    private async void btnComputeAsync_Click(object senderRoutedEventArgs e)
    {
        Console.WriteLine("Elaborazione async in corso...");
        int somma = await ComputeAsync();
        Console.WriteLine("Elaborazione async terminata: " + somma);
    }
}

 

XAML

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Async/Await C# 4.5" Height="184.831" Width="346.723">
    <Grid>
        <Button Content="Compute" HorizontalAlignment="Left" Margin="38,53,0,0" VerticalAlignment="Top" Width="97" Name="btnCompute" Click="btnCompute_Click"/>
        <Button Content="Compute async" HorizontalAlignment="Left" Margin="171,53,0,0" VerticalAlignment="Top" Width="97" Name="btnComputeAsync" Click="btnComputeAsync_Click"/>
    </Grid>
</Window>

Nell'esempio abbiamo i due metodi:
  • Compute(): metodo sincrono
  • ComputeAsync(): metodo asincrono (per convezione un metodo asincrono termina col suffisso Async), che restituisce un tipo Task<TResult> (Task<int> nel nostro caso). Se il metodo asincrono non deve ritornare nessun tipo basta mettere solo Task.
Il metodo che richiama ComputeAsync() è contrassegnato dalla parola chiave async ed attende il suo terminamento mediante await.

Per approfondire l'argomento vi rimando al sito ufficiale dell'MSDN

Nessun commento:

Posta un commento