La programació asíncrona és una tècnica que permet executar operacions de manera no bloquejant, millorant així la resposta i l'eficiència de les aplicacions. En C#, la programació asíncrona es gestiona principalment mitjançant les paraules clau async i await.

Conceptes Clau

  1. async i await

  • async: Aquesta paraula clau s'utilitza per marcar un mètode com a asíncron. Un mètode async pot contenir una o més operacions asíncrones.
  • await: Aquesta paraula clau s'utilitza per esperar la finalització d'una operació asíncrona. Quan s'utilitza await, el control es retorna al mètode que va cridar el mètode asíncron fins que l'operació asíncrona es completa.

  1. Task i Task<T>

  • Task: Representa una operació asíncrona que no retorna un valor.
  • Task<T>: Representa una operació asíncrona que retorna un valor de tipus T.

Exemples Pràctics

Exemple 1: Mètode Asíncron Simple

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Iniciant operació...");
        await OperacioAsincrona();
        Console.WriteLine("Operació completada.");
    }

    static async Task OperacioAsincrona()
    {
        await Task.Delay(2000); // Simula una operació que triga 2 segons
        Console.WriteLine("Operació asíncrona en procés...");
    }
}

Explicació:

  • Main és el punt d'entrada del programa i està marcat com async perquè crida a OperacioAsincrona amb await.
  • OperacioAsincrona és un mètode asíncron que simula una operació que triga 2 segons utilitzant Task.Delay.

Exemple 2: Mètode Asíncron amb Retorn de Valor

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Iniciant càlcul...");
        int resultat = await CalculAsincron();
        Console.WriteLine($"Resultat del càlcul: {resultat}");
    }

    static async Task<int> CalculAsincron()
    {
        await Task.Delay(2000); // Simula una operació que triga 2 segons
        return 42; // Retorna un valor després de la simulació
    }
}

Explicació:

  • CalculAsincron és un mètode asíncron que retorna un Task<int>.
  • Després de la simulació de 2 segons, retorna el valor 42.

Exercicis Pràctics

Exercici 1: Operació Asíncrona amb Retard

Descripció: Crea un mètode asíncron que simuli una operació de descàrrega de fitxers que triga 3 segons. Mostra un missatge abans i després de la descàrrega.

Solució:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Iniciant descàrrega...");
        await DescarregarFitxer();
        Console.WriteLine("Descàrrega completada.");
    }

    static async Task DescarregarFitxer()
    {
        await Task.Delay(3000); // Simula una descàrrega que triga 3 segons
        Console.WriteLine("Fitxer descarregat.");
    }
}

Exercici 2: Càlcul Asíncron amb Paràmetres

Descripció: Crea un mètode asíncron que accepti dos enters com a paràmetres, simuli un càlcul que triga 1 segon i retorni la seva suma.

Solució:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        int a = 5;
        int b = 7;
        Console.WriteLine("Iniciant càlcul...");
        int resultat = await SumarAsincron(a, b);
        Console.WriteLine($"Resultat del càlcul: {resultat}");
    }

    static async Task<int> SumarAsincron(int x, int y)
    {
        await Task.Delay(1000); // Simula un càlcul que triga 1 segon
        return x + y; // Retorna la suma dels dos paràmetres
    }
}

Errors Comuns i Consells

Errors Comuns

  1. Oblidar await en cridar un mètode asíncron: Això farà que el mètode asíncron s'executi sense esperar el seu resultat.
  2. No marcar un mètode com async: Si un mètode conté await, ha de ser marcat com async.

Consells

  • Utilitza la programació asíncrona per a operacions que poden trigar temps, com ara accés a fitxers, operacions de xarxa o càlculs intensius.
  • Evita utilitzar async void excepte en gestors d'esdeveniments, ja que no permet capturar excepcions de manera efectiva.

Conclusió

La programació asíncrona en C# és una eina poderosa per millorar la resposta i l'eficiència de les aplicacions. Mitjançant l'ús de async i await, pots gestionar operacions de manera no bloquejant, permetent que la teva aplicació continuï responent mentre es completen les operacions de fons. Practica amb els exemples i exercicis proporcionats per dominar aquests conceptes.

© Copyright 2024. Tots els drets reservats