Start Debugging

Streaming de tarefas com Task.WhenEach do .NET 9

O .NET 9 introduz Task.WhenEach, que retorna um IAsyncEnumerable de tarefas conforme elas completam. Aqui está como ele simplifica o processamento de resultados paralelos conforme chegam.

Lidar com várias tarefas paralelas sempre foi meio binário no .NET. Você ou espera tudo terminar (Task.WhenAll) ou espera a primeira (Task.WhenAny).

Mas e se você quer processar resultados conforme eles chegam?

Antes do .NET 9, você tinha que escrever um loop complexo envolvendo Task.WhenAny, removendo tarefas terminadas de uma lista e iterando de novo. Isso não só era verboso como tinha características de desempenho O(N^2).

Entra Task.WhenEach

No .NET 9, Task.WhenEach resolve isso nativamente. Ele retorna um IAsyncEnumerable que entrega tarefas conforme elas completam.

using System.Threading.Tasks;

public async Task ProcessImagesAsync(List<string> urls)
{
    // Start all downloads in parallel
    List<Task<byte[]>> downloadTasks = urls.Select(DownloadAsync).ToList();

    // Process them one by one, as soon as they finish
    await foreach (var completedTask in Task.WhenEach(downloadTasks))
    {
        try 
        {
            byte[] image = await completedTask;
            Console.WriteLine($"Processed image: {image.Length} bytes");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"One download failed: {ex.Message}");
        }
    }
}

Por que isso importa

  1. Experiência do usuário: em apps de UI (MAUI, WPF), você pode renderizar itens progressivamente em vez de mostrar um spinner até o batch inteiro acabar.
  2. Throughput: em serviços de backend, você pode começar a processar os primeiros resultados imediatamente, mantendo a CPU alimentada enquanto espera operações de I/O mais lentas terminarem.
  3. Simplicidade: o código é linear e legível. Sem mais loops while ou mutações de lista.

Essa é uma daquelas pequenas adições de API que apagam um monte de código “utilitário” dos nossos projetos.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar