

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Hook di runtime SnapStart per Lambda per .NET
<a name="snapstart-runtime-hooks-dotnet"></a>

Gli hook di runtime possono essere utilizzati per implementare il codice prima che Lambda crei uno snapshot o dopo che ha ripristinato una funzione da uno snapshot. Gli hook di runtime .NET sono disponibili come parte del pacchetto [Amazon.Lambda.Core](https://www.nuget.org/packages/Amazon.Lambda.Core) (versione 2.5.0 o successiva). Questa libreria fornisce due metodi che possono essere utilizzati per definire i tuoi hook di runtime:
+ `RegisterBeforeSnapshot()`: codice da eseguire prima della creazione dello snapshot
+ `RegisterAfterSnapshot()`: codice da eseguire dopo la ripresa di una funzione da uno snapshot

**Nota**  
Se utilizzi il [framework Lambda Annotations per .NET](csharp-handler.md#csharp-handler-annotations), esegui l'upgrade alla versione 1.6.0 o successiva di [Amazon.Lambda.Annotations](https://www.nuget.org/packages/Amazon.Lambda.Annotations) per garantire la compatibilità con SnapStart.

## Registrazione ed esecuzione di hook di runtime
<a name="runtime-hooks-registration-dotnet"></a>

Registra i tuoi hook nel codice di inizializzazione. Prendi in considerazione le seguenti linee guida basate sul [modello di esecuzione](csharp-handler.md#csharp-handler-setup) della tua funzione Lambda:
+ Per l'[approccio all'assembly eseguibile](csharp-handler.md#csharp-executable-assembly-handlers), registra i tuoi hook prima di avviare il bootstrap Lambda con `RunAsync`.
+ Per l'[approccio basato sulle librerie di classi](csharp-handler.md#csharp-class-library-handlers), registra i tuoi hook nel costruttore della classe handler.
+ Per le [applicazioni ASP.NET Core](csharp-package-asp.md), registra gli hook prima di chiamare il metodo `WebApplications.Run`.

Per registrare gli hook di runtime per SnapStart in .NET, utilizza i seguenti metodi:

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

Quando vengono registrati più tipi di hook, l'ordine in cui Lambda esegue gli hook di runtime è determinato dall'ordine di registrazione:
+ `RegisterBeforeSnapshot()`: eseguito nell'ordine di registrazione inverso
+ `RegisterAfterSnapshot()`: eseguito nell'ordine di registrazione

**Nota**  
Quando Lambda crea uno snapshot, il codice di inizializzazione può essere eseguito per un massimo di 15 minuti. Il limite di tempo è 130 secondi o il [timeout della funzione configurato](configuration-timeout.md) (massimo 900 secondi), a seconda di quale dei due valori sia più elevato. I tuoi hook di runtime `RegisterBeforeSnapshot()` contano ai fini del limite di tempo del codice di inizializzazione. Quando Lambda ripristina uno snapshot, il runtime deve essere caricato e gli hook di runtime `RegisterAfterSnapshot()` devono essere completati entro il limite di timeout (10 secondi). Altrimenti, otterrai un'eccezione SnapStartTimeoutException.

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

La seguente funzione di esempio mostra come eseguire il codice prima del checkpoint (`RegisterBeforeSnapshot`) e dopo il ripristino (`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
        };
    }
}
```