Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Explicação sobre o método WhenAll

No texto fala que o WhenAll "...permite que você execute várias tarefas assíncronas e aguarde que todas sejam concluídas, sem bloquear o thread principal.".

Mas na documentação do método, temos um exemplo em que o await é utilizado e nela fala que a verificação de status só ocorre quando todas as tasks são concluídas. Ou seja, há bloqueio do thread principal, não?

Além disso, no exemplo deste ponto é impressa a string "Todas as tarefas foram concluídas!". Indicando que essa frase só é impressa depois que todas as tarefas executarem no pool de Tasks.

Entendi algo errado? Ou é o texto que deve incluir que o WhenAll bloqueia o thread principal?

3 respostas

Oi Marcus, bom dia.

A sua dúvida é bastante comum e é importante entender como o await Task.WhenAll funciona para não confundir os conceitos. Vamos lá!

O método WhenAll é usado para executar várias tarefas assíncronas e aguardar que todas sejam concluídas. Quando dizemos que ele "não bloqueia o thread principal", estamos nos referindo ao fato de que, enquanto as tarefas estão sendo executadas, o thread principal não fica parado esperando, como acontece com o WaitAll em multithreading tradicional. Em vez disso, ele continua livre para executar outras operações até que o ponto de await seja alcançado.

No exemplo que você mencionou, o await é utilizado para aguardar a conclusão de todas as tarefas. Isso significa que, naquele ponto específico do código, a execução do método assíncrono é suspensa até que todas as tarefas sejam concluídas. No entanto, essa suspensão não bloqueia o thread principal de forma tradicional, permitindo que outras operações assíncronas continuem a ser processadas.

Por exemplo, se você tiver uma interface de usuário, ela permanecerá responsiva enquanto as tarefas estão sendo aguardadas, porque o thread da interface não está bloqueado. Isso é diferente de um bloqueio tradicional, onde o thread realmente para de executar qualquer outra coisa até que a operação seja concluída.

Portanto, a frase "Todas as tarefas foram concluídas!" só é impressa após a conclusão de todas as tarefas, mas durante a execução dessas tarefas, o thread principal não está bloqueado de maneira tradicional.

Espero ter ajudado e bons estudos! Qualquer dúvida estamos a disposição.

Ajudou sim, André. Obrigado!

Então o bloqueio funciona somente naquele método assíncrono em que o WhenAll é implementado, enquanto o resto da aplicação funciona normalmente.

Entendo também que se não tivesse o await na chamada do WhenAll, nem o método assíncrono ficaria aguardando e a frase "Todas as tarefas foram concluídas!" seria impressa logo em seguida.

É isso mesmo?

solução!

Boa tarde Marcus, tudo beleza?

É isso mesmo.