CSharp: Programación asíncrona

Descubre cómo implementar programación asíncrona en C# con ejemplos prácticos y recomendaciones actualizadas para programadores de software.

La programación asíncrona en C# permite ejecutar tareas de manera no bloqueante, mejorando el rendimiento de las aplicaciones. En el contexto de C#, la programación asíncrona se realiza principalmente utilizando las palabras clave async y await, además de las clases Task y Task<T>. A continuación, se presentan conceptos clave y ejemplos prácticos para entender y aplicar programación asíncrona en C#.

Conceptos básicos

async y await

Las palabras clave async y await son fundamentales en la programación asíncrona de C#. La palabra clave async se utiliza para marcar un método como asíncrono, mientras que await se utiliza para esperar de manera asíncrona la finalización de una tarea.

public async Task EjemploAsincrono()
{
    await TareaAsincrona();
}

Task y Task

La clase Task representa una operación asíncrona que no devuelve un valor, mientras que Task<T> representa una operación asíncrona que devuelve un valor de tipo T.

public async Task<int> ObtenerResultadoAsincrono()
{
    await Task.Delay(1000); // Simula una operación asíncrona
    return 42;
}

Implementación de métodos asíncronos

Métodos que no devuelven valor

Para implementar un método asíncrono que no devuelva un valor, se utiliza Task como tipo de retorno y se emplea await para esperar la finalización de tareas asíncronas.

public async Task ProcesarDatosAsincrono()
{
    // Simula una operación de procesamiento de datos
    await Task.Delay(2000);
    Console.WriteLine("Datos procesados");
}

Métodos que devuelven valor

Para métodos que devuelven un valor, se utiliza Task<T> como tipo de retorno y se emplea await para obtener el resultado de la tarea.

public async Task<string> ObtenerDatosAsincrono()
{
    await Task.Delay(1000); // Simula una operación asíncrona
    return "Datos obtenidos";
}

Manejo de excepciones

En la programación asíncrona, las excepciones pueden ser manejadas utilizando bloques try-catch dentro de los métodos marcados con async.

public async Task ManejarExcepcionesAsincrono()
{
    try
    {
        await Task.Run(() => throw new InvalidOperationException("Error simulado"));
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine($"Excepción manejada: {ex.Message}");
    }
}

Ejecución paralela de tareas

Para ejecutar múltiples tareas en paralelo, se puede utilizar Task.WhenAll, que espera a que todas las tareas proporcionadas se completen.

public async Task EjecutarTareasParalelas()
{
    var tarea1 = Task.Delay(1000);
    var tarea2 = Task.Delay(2000);
    await Task.WhenAll(tarea1, tarea2);
    Console.WriteLine("Todas las tareas completadas");
}

Cancelación de tareas

La cancelación de tareas se maneja mediante el uso de CancellationToken. Este token se pasa a los métodos asíncronos y permite cancelar la ejecución de las tareas.

public async Task CancelarTarea(CancellationToken token)
{
    try
    {
        await Task.Delay(5000, token);
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("Tarea cancelada");
    }
}

Para utilizar CancellationToken, se debe crear una instancia de CancellationTokenSource y pasar su token a los métodos asíncronos.

var cts = new CancellationTokenSource();
var tarea = CancelarTarea(cts.Token);
cts.Cancel(); // Cancela la tarea
Certifícate en CSharp con CertiDevs PLUS

Lecciones de este módulo de CSharp

Lecciones de programación del módulo Programación asíncrona del curso de CSharp.

Ejercicios de programación en este módulo de CSharp

Evalúa tus conocimientos en Programación asíncrona con ejercicios de programación Programación asíncrona de tipo Test, Puzzle, Código y Proyecto con VSCode.