> 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/aprender/fundamentos/hibernacao-e-retomada.md).

# Hibernação e retomada

Quando uma function chega em um ponto de espera, ela para de existir em memória e volta exatamente de onde parou quando a espera termina. Esta página explica os dois movimentos e o que eles permitem.

## Hibernar

Hibernar é pausar a execução de uma function sem deixá-la rodando: sem thread, sem processo ativo, sem memória alocada para ela.

Quando a function chega em um ponto de espera, `SkailTask.WaitForEvent` ou `SkailTask.Delay`, o skail registra em que ponto a execução está e o que é necessário para continuar depois, e encerra a execução naquele momento. O processo da sua aplicação fica livre para tratar outras execuções, ou para ser reiniciado, atualizado e movido de servidor. Nada disso afeta a execução hibernada.

## Retomar

Retomar é quando a execução hibernada volta a executar exatamente de onde parou, como se nunca tivesse parado.

Quando o evento esperado acontece (um webhook, uma aprovação) ou o tempo do delay passa, o skail entrega a execução de novo à sua aplicação. O runtime reexecuta a function a partir do histórico da execução: os passos já concluídos devolvem os resultados gravados sem rodar de novo, e o fluxo continua a partir do ponto de espera. Sem repetir o que já foi feito, sem recomeçar do zero e sem você controlar nada disso manualmente. O mecanismo por trás é o replay, explicado em [Determinismo e replay](/aprender/fundamentos/determinismo-e-replay.md).

## O que isso permite

Fluxos que duram minutos, horas, dias ou meses sem manter nada rodando em segundo plano e sem perder o contexto da execução. Uma régua de cobrança de 30 dias, uma aprovação que leva uma semana, um processo que espera o retorno de um órgão público: cada um é uma function com um `Delay` ou um `WaitForEvent`, e o custo enquanto espera é zero.

Isso se traduz em mais escala (um processo pequeno acompanha milhares de execuções em espera), mais confiabilidade (uma queda no meio da espera não perde nada) e uso de recursos proporcional ao trabalho, não ao tempo de espera.

## O que muda para quem escreve código

Nada no código. `await SkailTask.Delay(TimeSpan.FromDays(30))` é uma linha. As consequências estão em volta dela: o corpo da function será reexecutado na retomada, então ele precisa ser determinístico; o código publicado no momento da retomada precisa ter a mesma sequência de `await`s, então mudanças exigem versionamento; e o estado que importa vive nos argumentos e nos resultados dos commands, não em campos da classe, que são descartados na hibernação.

## Próximos passos

[Tempo e agendamento](/aprender/fundamentos/tempo-e-agendamento.md) para como o `Delay` funciona. [Eventos externos e correlação](/aprender/fundamentos/eventos-externos-e-correlacao.md) para o `WaitForEvent`. [Versionamento de código com execuções em andamento](/aprender/fundamentos/versionamento-de-codigo-com-execucoes-em-andamento.md) para o que fazer antes de mudar uma function que tem execuções hibernadas.
