> For the complete documentation index, see [llms.txt](https://docs.skail.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skail.dev/funcionalidades/sdk/whenall.md).

# WhenAll

Quando sua lógica precisa disparar várias operações ao mesmo tempo e só continuar depois que **todas elas terminarem**, você usa `SkailTask.WhenAll`.

```csharp
[SkailFunction]
public async SkailTask EmitirDocumento(Guid documentoId)
{
    var consultarEmitente = ConsultarEmitente(Guid.NewGuid());
    var gerarDocumento = GerarDocumento(documentoId);

    await SkailTask.WhenAll(consultarEmitente, gerarDocumento);

    await BuscarDocumento(documentoId);
    await EnviarWebhook(documentoId);
}
```

As operações são disparadas simultaneamente. A execução só avança para `BuscarDocumento` quando **as duas** tiverem concluído.

#### Como o runtime lida com as respostas

Cada vez que uma das tarefas responde, o runtime retoma brevemente a execução para contabilizar o resultado e verifica se ainda faltam respostas. Se sim, hiberna \[link para explicação de hibernação] novamente e aguarda. Só na última resposta a execução segue de vez.

Isso significa que, no **Monitor** do [portal do skail](https://app.skailhq.com/), você vai ver todas as operações na função principal.

#### Combinando com Delay

Você pode incluir um `Delay` junto com as demais tarefas para impor um tempo mínimo de espera antes de continuar:

```csharp
await SkailTask.WhenAll(
    ConsultarEmitente(emitenteId),
    GerarDocumento(documentoId),
    SkailTask.DelayMinutes(1)
);
```

Aqui a execução só avança quando as duas operações tiverem concluído **e** o minuto tiver passado — o que acontecer por último.
