

# Hooks de runtime do Lambda SnapStart para .NET
<a name="snapstart-runtime-hooks-dotnet"></a>

É possível usar hooks de runtime para implementar o código antes que o Lambda crie um snapshot ou depois que o Lambda retorna uma função de um snapshot. Os hooks de runtime do.NET estão disponíveis como parte do pacote [Amazon.Lambda.Core](https://www.nuget.org/packages/Amazon.Lambda.Core) (versão 2.5.0 ou posterior). Essa biblioteca fornece dois métodos que você pode usar para definir seus hooks de runtime:
+ `RegisterBeforeSnapshot()`: código a ser executado antes da criação do snapshot
+ `RegisterAfterSnapshot()`: código a ser executado após retomar uma função de um snapshot

**nota**  
Se você estiver usando a [estrutura Lambda Annotations para .NET](csharp-handler.md#csharp-handler-annotations), atualize para [Amazon.Lambda.Annotations](https://www.nuget.org/packages/Amazon.Lambda.Annotations) versão 1.6.0 ou posterior para garantir a compatibilidade com o SnapStart.

## Registro e execução do hook de runtime
<a name="runtime-hooks-registration-dotnet"></a>

Registre seus hooks no código de inicialização. Considere as seguintes diretrizes com base no [modelo de execução](csharp-handler.md#csharp-handler-setup) da função do Lambda:
+ Para a [abordagem de assembly executável](csharp-handler.md#csharp-executable-assembly-handlers), registre seus hooks antes de iniciar o bootstrap do Lambda com `RunAsync`.
+ Para a [abordagem de bibliotecas de classes](csharp-handler.md#csharp-class-library-handlers), registre seus hooks no construtor de classe do manipulador.
+ Para [aplicações ASP.NET Core](csharp-package-asp.md), registre seus hooks antes de chamar o método `WebApplications.Run`.

Para registrar hooks de runtime para o SnapStart no .NET, use os seguintes métodos:

```
Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterCheckpoint);
```

Quando vários tipos de hooks são registrados, a ordem em que o Lambda executa seus hooks de runtime é definida pela ordem de registro:
+ `RegisterBeforeSnapshot()`: executado na ordem inversa do registro
+ `RegisterAfterSnapshot()`: executado na ordem de registro

**nota**  
Quando o Lambda cria um snapshot, o código de inicialização pode ser executado por até 15 minutos. O limite de tempo é de 130 segundos ou o [tempo limite da função configurada](configuration-timeout.md) (máximo de 900 segundos), o que for maior. Seus hooks de runtime de `RegisterBeforeSnapshot()` contam até o limite de tempo do código de inicialização. Quando o Lambda restaura um snapshot, o runtime deve ser carregado e os hooks de runtime `RegisterAfterSnapshot()` devem ser concluídos dentro do limite de tempo limite (dez segundos). Caso contrário, você obterá uma SnapStartTimeoutException.

## Exemplo
<a name="runtime-hooks-dotnet-code-sample"></a>

A função exemplificada a seguir mostra como executar o código antes do ponto de verificação (`RegisterBeforeSnapshot`) e depois da restauração (`RegisterAfterRestore`).

```
public class SampleClass
{
    public SampleClass()
    {
        Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(BeforeCheckpoint);
        Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(AfterCheckpoint);
    }

    private ValueTask BeforeCheckpoint()
    {
        // Add logic to be executed before taking the snapshot
        return ValueTask.CompletedTask;
    }

    private ValueTask AfterCheckpoint()
    {
        // Add logic to be executed after restoring the snapshot
        return ValueTask.CompletedTask;
    }

    public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // Add business logic

        return new APIGatewayProxyResponse
        {
            StatusCode = 200
        };
    }
}
```