CSharp: Programación asíncrona

CSharp
CSharp
Actualizado: 27/08/2024

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

Lecciones de este módulo

Explora todas las lecciones disponibles en Programación asíncrona

Explora más sobre CSharp

Descubre más recursos de CSharp

Alan Sastre - Autor del curso

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, CSharp es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.