

# Enlaces de tiempo de ejecución de Lambda SnapStart para .NET
<a name="snapstart-runtime-hooks-dotnet"></a>

Puede utilizar enlaces de tiempo de ejecución para implementar el código antes de que Lambda cree una instantánea o después de que Lambda restaure una función desde una instantánea. Los enlaces de tiempo de ejecución de .NET están disponibles como parte del paquete [Amazon.Lambda.Core](https://www.nuget.org/packages/Amazon.Lambda.Core) (versión 2.5.0 o posterior). Esta biblioteca brinda dos métodos que puede utilizar para definir sus enlaces de tiempo de ejecución:
+ `RegisterBeforeSnapshot()`: código para ejecutar antes de la creación de la instantánea
+ `RegisterAfterSnapshot()`: código para ejecutar después de reanudar una función a partir de una instantánea

**nota**  
Si utiliza el [marco de Lambda Annotations para .NET](csharp-handler.md#csharp-handler-annotations), actualice a [Amazon.Lambda.Annotations](https://www.nuget.org/packages/Amazon.Lambda.Annotations) versión 1.6.0 o posterior para garantizar la compatibilidad con SnapStart.

## Registro y ejecución de enlaces en tiempo de ejecución
<a name="runtime-hooks-registration-dotnet"></a>

Registre sus enlaces en el código de inicialización. Tenga en cuenta las siguientes pautas según el modelo de [ejecución](csharp-handler.md#csharp-handler-setup) de la función de Lambda:
+ Para el [enfoque de ensamblaje ejecutable](csharp-handler.md#csharp-executable-assembly-handlers), registre los enlaces antes de iniciar el arranque de Lambda con `RunAsync`.
+ Para el [enfoque de biblioteca de clase](csharp-handler.md#csharp-class-library-handlers), registre sus enlaces en el constructor de clase del controlador.
+ En el [caso de las aplicaciones ASP.NET Core](csharp-package-asp.md), registre los enlaces antes de llamar al método `WebApplications.Run`.

Para registrar los enlaces en tiempo de ejecución para SnapStart en .NET, utilice los métodos siguientes:

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

Cuando se registran varios tipos de enlaces, el orden en el que Lambda ejecuta los enlaces en tiempo de ejecución viene determinado por el orden de registro:
+ `RegisterBeforeSnapshot()`: se ejecuta en el orden inverso al de registro
+ `RegisterAfterSnapshot()`: se ejecuta en el orden del registro

**nota**  
Cuando Lambda crea una instantánea, el código de inicialización puede ejecutarse durante un máximo de 15 minutos. El límite de tiempo es de 130 segundos o el [tiempo de espera de la función configurado](configuration-timeout.md) (máximo de 900 segundos), lo que sea mayor. Los enlaces en tiempo de ejecución `RegisterBeforeSnapshot()` cuentan para el límite de tiempo del código de inicialización. Cuando Lambda restaura una instantánea, el tiempo de ejecución debe cargarse y los enlaces de tiempo de ejecución `RegisterAfterSnapshot()` deben completarse antes de que transcurra el tiempo de espera (10 segundos). De lo contrario, obtendrá una excepción SnapStartTimeoutException.

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

La siguiente función de ejemplo muestra cómo ejecutar el código antes de comprobar (`RegisterBeforeSnapshot`) y después de restaurarlo (`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
        };
    }
}
```