using var tokenSource = new CancellationTokenSource(10_000);
var token = tokenSource.Token;
await foreach (var data in Task.WhenEach(tasks).WithCancellation(token))
{
    if (!tokenSource.TryReset()) 
        token.ThrowIfCancellationRequested();
    Console.WriteLine(await data);
    tokenSource.CancelAfter(10_000);
}

No exemplo de código anterior, CancellationTokenSource é usado para criar instâncias de CancellationToken, que representa um token de cancelamento a ser usado para cancelamento de uma tarefa. O método ThrowIfCancellationRquested será chamado para lançar uma OperationCanceledException se o cancelamento tiver sido solicitado. O método CancelAfter é usado para agendar uma operação de cancelamento assim que o número especificado de milissegundos decorre.

Principais conclusões

O Task.WhenEach é um novo método estático assíncrono introduzido no .NET 9 que aborda as limitações dos métodos Task.WhenAll e Task.WhenAny. Ao permitir o processamento imediato de tarefas concluídas, melhora consideravelmente o desempenho e a escalabilidade das suas aplicações.

Observe que você pode usar ThrowIfCancellationRequested somente dentro de uma tarefa. Neste caso, você não terá que tratar nenhuma exceção explicitamente. Em vez disso, quando esse método é chamado em uma instância de token, a execução deixa a tarefa em execução no momento e a propriedade Task.IsCancelled é definida como True.