Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

360
Visualizações
Why does the Task.WhenAny not throw an expected TimeoutException?

Please, observe the following trivial code:

class Program
{
    static void Main()
    {
        var sw = new Stopwatch();
        sw.Start();
        try
        {
            Task.WhenAny(RunAsync()).GetAwaiter().GetResult();
        }
        catch (TimeoutException)
        {
            Console.WriteLine("Timed out");
        }
        Console.WriteLine("Elapsed: " + sw.Elapsed);
        Console.WriteLine("Press Enter to exit");
        Console.ReadLine();
    }

    private static async Task RunAsync()
    {
        await Observable.StartAsync(async ct =>
        {
            for (int i = 0; i < 10; ++i)
            {
                await Task.Delay(500, ct);
                Console.WriteLine("Inside " + i);
            }
            return Unit.Default;
        }).Timeout(TimeSpan.FromMilliseconds(1000));
    }
}

Running it outputs:

Inside 0
Inside 1
Elapsed: 00:00:01.1723818
Press Enter to exit

Note, no Timed out message.

Now, if I replace Task.WhenAny with Task.WhenAll here is what I get:

Inside 0
Inside 1
Timed out
Elapsed: 00:00:01.1362188
Press Enter to exit

Note the presence of the Timed out message this time.

And, if I remove the Task.WhenAll wrapper at all and call RunAsync directly:

Inside 0
Inside 1
Timed out
Elapsed: 00:00:01.1267617
Press Enter to exit

The Timed out message is there, as expected.

So what is the deal with Task.WhenAny ? It obviously interrupts the asynchronous method, but where is the TimeoutException?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Task.WhenAny doesn't rethrow exceptions from the individual tasks (unlike Task.WhenAll):

"The returned task will complete when any of the supplied tasks has completed. The returned task will always end in the RanToCompletion state with its Result set to the first task to complete. This is true even if the first task to complete ended in the Canceled or Faulted state."

From Task.WhenAny

That means that it will complete successfully no matter what without any type of exceptions.

To actually rethrow the exception of the individual completed task you need to await the returned task itself:

var completedTask = await Task.WhenAny(tasks); // no exception
await completedTask; // possible exception

Or in your case:

Task.WhenAny(RunAsync()).GetAwaiter().GetResult().GetAwaiter().GetResult();
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda